2011-06-05 95 views
0

嘿傢伙。我有一個JPanel,它在點擊時改變顏色(這在另一個類中正確處理)。JPanel不重繪,即使調用repaint()和重新驗證()

不幸的是,當我打電話重繪()方法,它不畫(或它調用的paintComponent方法與VAR currentBGColor舊的顏色值 - >參見下面的代碼)

public class MyClass extends JPanel { 

curentBGColor = Color.red; 
final int SIZE = 70; 
public MyClass(){ 
setPreferredSize (new Dimension (SIZE,SIZE)); 
} 

public void paintComponent (Graphics g) 
{ 
g.setColor (currentBGColor); //I want this to paint white when newColor() is called 
g.fillRect (0,0,getWidth(),getHeight()); 

g.setColor (Color.black); 
g.drawLine (0,0,SIZE-1,0); 
g.drawLine (0,0,0,SIZE-1); 
g.drawLine (0,SIZE-1,SIZE-1,SIZE-1); 
g.drawLine (SIZE-1,0,SIZE-1,SIZE-1); 
} 

void newColor(){ 
currentBGColor = Color.white; 
repaint(); 
revalidate(); 
} 
} 

有誰有什麼想法爲什麼它不用新的顏色繪畫?

回答

1

如果您從非EDT線程調用newColor,則Swing線程可能永遠不會知道currenBGColor的新值。您可以嘗試製作currentBGColorvolatile

編輯:

試圖volatile意味作爲一個調試工具,看它是否是一個線程問題。如果這是一個線程問題,爲了遵循正確的Swing線程模型,您不應該使用volatile,而是確保總是從Swing事件分派線程中調用newColor

+0

賓果!爲什麼我沒有想到這個? – 2011-06-05 21:52:20

+1

@Jimmy:不,揮發性在這裏是非常錯誤的,只會造成混淆。只是不要這樣做。是的,你應該撥打美國東部時間所有的鞦韆電話,但我不知道線程是否仍然是問題。我們需要了解您如何調用此方法來幫助您糾正錯誤,因爲上面的代碼沒有顯示錯誤,但請不要在此遵循託託的建議。我知道他表示很好,但這顯然是錯誤的。 – 2011-06-05 22:01:08

+0

是的,我正要添加一個評論,這不是Swing的方式。至少它確定了問題。 – toto2 2011-06-05 22:01:51