0

やあみんな。クリックすると色が変わるJPanelを持っています(これは別のクラスで正しく処理されます)。

残念ながら、repaint()メソッドを呼び出すと、ペイントされません(または、var currentBGColorの古いColor値を使用してpaintComponentメソッドを呼び出します->以下のコードを参照してください)

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();
}
}

なぜそれが新しい色で塗られていないのか誰かが知っていますか?

4

1 に答える 1

1

非EDTスレッドから呼び出す場合newColor、Swingスレッドはの新しい値を認識しない可能性がありますcurrenBGColor。作ってみてくださいcurrentBGColor volatile

編集:

試行volatileは、スレッドの問題であるかどうかを確認するためのデバッグツールとして意図されていました。スレッドの問題である場合は、正しいSwingスレッドモデルに従うために、使用しないでください。volatile代わりに、newColor常にSwingイベントディスパッチスレッドから呼び出されるようにしてください。

于 2011-06-05T21:46:14.203 に答える