2011-06-05 65 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