Java JPanel不重新绘制,即使在调用repaint()和revalidate()时也是如此
嘿,伙计们。我有一个JPanel,当它被点击时会改变颜色(这在另一个类中被正确处理) 不幸的是,当我调用repaint()方法时,它没有绘制(或者它使用var currentBGColor->的旧颜色值调用paintComponent方法,请参见下面的代码)Java JPanel不重新绘制,即使在调用repaint()和revalidate()时也是如此,java,colors,jpanel,paintcomponent,Java,Colors,Jpanel,Paintcomponent,嘿,伙计们。我有一个JPanel,当它被点击时会改变颜色(这在另一个类中被正确处理) 不幸的是,当我调用repaint()方法时,它没有绘制(或者它使用var currentBGColor->的旧颜色值调用paintComponent方法,请参见下面的代码) 有人知道为什么不使用新颜色绘制吗?如果从非EDT线程调用newColor,Swing线程可能永远不会知道currenBGColor的新值。您可以尝试将currentBGColor设置为volatile 编辑: 尝试volatile的目的是作
有人知道为什么不使用新颜色绘制吗?如果从非EDT线程调用
newColor
,Swing线程可能永远不会知道currenBGColor
的新值。您可以尝试将currentBGColor
设置为volatile
编辑:
尝试
volatile
的目的是作为一个调试工具,看看这是否是线程问题。如果是线程问题,为了遵循正确的Swing线程模型,您不应该使用volatile
,而是要确保始终从Swing事件调度线程调用newColor
。Bingo!吉米:不,volatile在这里是非常错误的,它只会让人迷惑。不要这样做。是的,您应该在EDT上调用大多数swing调用,但我不知道线程是否是问题所在。我们需要看看你是如何调用这个方法来帮助你纠正它的,因为上面的代码没有显示错误,但是请不要遵循toto的建议。我知道他的意思是好的,但这完全是错的。是的,我想补充一点,这不是摇摆的方式。至少它能确定问题所在。@toto:我甚至不会说它能做到这一点。就我们所知,他是个变量阴影。@toto:我强烈建议你删除这个答案——就是错了。
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();
}
}