JPanel没有重新绘制,即使在调用repaint()和revalidate()时也是如此

时间:2011-06-05 21:39:03

标签: java colors jpanel paintcomponent

嘿伙计们。我有一个JPanel,当它被点击时会改变颜色(这在另一个类中正确处理)。

不幸的是,当我调用repaint()方法时,它不会绘制(或者使用旧的Color值调用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 个答案:

答案 0 :(得分:1)

如果从非EDT线程调用newColor,则Swing线程可能永远不会知道currenBGColor的新值。您可以尝试制作currentBGColor volatile

编辑:

尝试使用volatile作为调试工具来查看它是否是一个线程问题。如果它是一个线程问题,为了遵循正确的Swing线程模型,您不应该使用volatile,而是确保始终从Swing事件调度线程调用newColor