2017-12-18 157 views
0

我是新來Java,不知道到底是什麼cause.Let我解釋問題我試圖矩形顏色更改爲黑色,但它不工作

我創建一個矩形,和它的工作,然後我想改變它的顏色爲黑色的一些測試,但似乎不工作以下是我的代碼。 當我從paintComponent本身調用的方法,然後它的工作,但如果我從任何其他方法做同樣的事情,那麼它不會改變顏色。我試圖調用方法重繪也不過還是一樣

public class Meme extends JPanel { 

Rectangle2D.Float myRect = new Rectangle2D.Float(90, 90, 90, 90); 
Graphics2D graphics2d; 

public void DRAW() { 
    graphics2d.setColor(new Color(0, 0, 200)); 
    graphics2d.fill(myRect); 
} 

public void ChangeColour() { 
    System.out.println("Called"); 
    graphics2d.setPaint(Color.BLACK); 
    System.out.println("Called2"); 
    graphics2d.fill(myRect); 
    System.out.println("Called3"); 
} 

@Override 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    graphics2d = (Graphics2D) g; 
    graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
    graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
    DRAW(); 
} 

}

按鈕點擊監聽方法

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    meme1.ChangeColour(); 
} 
+0

你需要調用changecolor函數 –

+0

是的,我從paintComonent調用它的工作..但是,當我從另一個函數調用該方法時不起作用 –

+0

所有的繪畫都應該在'paintComponent'方法內完成。這個想法是你改變狀態(即顏色)並調用'repaint'來觸發新的paint pass – MadProgrammer

回答

0

至於我還記得,當你改變一些屬性(顏色在這情況),你必須打電話repaint。這將調用paintComponent並再次繪製框架。

在你的情況,我猜測,即使你調用重繪改變顏色後,抽籤方法被再次的paintComponent其重置變色回(0,0,200)調用。因此,您在屏幕上看不到任何更改。但是,當你的paintComponent方法調用changeColor(假設調用後繪製),顏色的變化仍然存在,並沒有得到重寫。

可能的解決方案

只要保持存儲在其他地方的顏色。像

Color myColor = new Color(0,0,200); 

然後在DRAW:

private void DRAW() { 
    graphics2d.setColor(myColor); 
    graphics2d.fill(myRect); 
} 

和ChangeColor:

private void ChangeColour() { 
    myColor = Color.BLACK; 
} 

希望它能幫助。

+0

我會更新代碼和張貼在這裏先生:)感謝您的提示 –

+0

我編輯了一個建議的可能的解決方案 – Soulslayer

+0

非常感謝你的先生現在的工作:) –

0

更新像在Swing這

public void ChangeColour() { 
    System.out.println("Called"); 
    graphics2d.setColor(new Color(1, 1, 200)); 
    System.out.println("Called2"); 
    graphics2d.fill(myRect); 
    System.out.println("Called3"); 
} 
+0

謝謝先生:)快速回復 –

+0

當我點擊積極的一些彈出是觸發先生,感謝您的feedbacl!那些投不到票15reputation是記錄,但不改變公開展示後得分 –

+0

如果它解決您的問題,然後向上投票,並標記爲已解決:) –

0

繪畫的功能是被動的和破壞性的。也就是說,任何時候都可能出現塗料過關,其中許多原因是您無法控制的。破壞性意味着,在每次通過塗料時,您都需要重新從頭開始重新塗刷整個組件。

在Swing中,你更新你想改變,然後調用repaint引發新的油漆通狀態。

繪畫不僅要永遠畫目前的狀態,它不應該嘗試改變它

public class Meme extends JPanel { 

    Rectangle2D.Float myRect = new Rectangle2D.Float(90, 90, 90, 90); 
    private Color color; 

    public void draw(Graphics2D graphics2d) { 
     graphics2d.setColor(color); 
     graphics2d.fill(myRect); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(200, 200); 
    } 

    public void ChangeColour() { 
     color = Color.BLACK; 
     repaint(); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     graphics2d = (Graphics2D) g.create(); 
     graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
     graphics2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); 
     draw(graphics2d); 
     graphics2d.dispose(); 
    } 
} 

此外,圖形上下文傳遞給您的組件與所有其他組件共享,所以它的任何顯著重要您對環境的變化被撤銷的方法存在之前 - 在大多數情況下,它是在Graphics方面呼籲create到快照的狀態和dispose(你創建的副本),當你做的只是一個簡單的例子

+0

好的,先生,我將繼續留在介意:D –

相關問題