Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPanel不重新绘制,即使在调用repaint()和revalidate()时也是如此_Java_Colors_Jpanel_Paintcomponent - Fatal编程技术网

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

Java JPanel不重新绘制,即使在调用repaint()和revalidate()时也是如此,java,colors,jpanel,paintcomponent,Java,Colors,Jpanel,Paintcomponent,嘿,伙计们。我有一个JPanel,当它被点击时会改变颜色(这在另一个类中被正确处理) 不幸的是,当我调用repaint()方法时,它没有绘制(或者它使用var currentBGColor->的旧颜色值调用paintComponent方法,请参见下面的代码) 有人知道为什么不使用新颜色绘制吗?如果从非EDT线程调用newColor,Swing线程可能永远不会知道currenBGColor的新值。您可以尝试将currentBGColor设置为volatile 编辑: 尝试volatile的目的是作

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

不幸的是,当我调用repaint()方法时,它没有绘制(或者它使用var currentBGColor->的旧颜色值调用paintComponent方法,请参见下面的代码)


有人知道为什么不使用新颜色绘制吗?

如果从非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();
}
}