JPanel не перерисовывается даже при вызове repaint () и revalidate () - PullRequest
0 голосов
/ 06 июня 2011

Привет, ребята. У меня есть JPanel, который меняет цвет при нажатии (это правильно обрабатывается в другом классе).

К сожалению, когда я вызываю метод repaint (), он не рисует (или вызывает метод paintComponent со старым значением Color для 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 Ответ

1 голос
/ 06 июня 2011

Если вы вызываете newColor из потока, не являющегося EDT, поток Swing может никогда не узнать новое значение currenBGColor.Вы можете попытаться сделать currentBGColor volatile.

Edit:

попытка volatile как инструмент отладки, чтобы увидеть, является ли это поточной проблемой.Если это проблема с потоками, чтобы следовать правильной модели потоков Swing, вы не должны использовать volatile, но вместо этого убедитесь, что newColor всегда вызывается из потока отправки событий Swing.

...