2011-06-05 4 views
0

Salut les gars. J'ai un JPanel qui change de couleur quand on clique dessus (ceci est géré correctement dans une autre classe).JPanel ne pas repeindre, même en appelant repaint() et revalidate()

Malheureusement, quand je l'appelle la méthode, il ne peint pas (ou il appelle la méthode paintComponent avec l'ancienne valeur de couleur pour var currentBGColor -> voir le code ci-dessous) repeindre()

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

Est-ce que quelqu'un avoir une idée de pourquoi il ne peint pas avec la nouvelle couleur?

Répondre

1

Si vous appelez newColor à partir d'un thread non-EDT, le thread Swing peut ne jamais connaître la nouvelle valeur de currenBGColor. Vous pourriez essayer de faire currentBGColorvolatile.

Edit:

essayer volatile a été conçu comme un outil de débogage pour voir si elle est un problème de filetage. S'il s'agit d'un problème de threading, afin de suivre le modèle de threading Swing correct, vous ne devez pas utiliser volatile mais assurez-vous que newColor est toujours appelé depuis le thread de distribution d'événement Swing.

+0

Bingo! Pourquoi je n'y ai pas pensé? –

+1

@Jimmy: Non, volatile est très mauvais ici et ne fera que confuser. Ne fais pas ça. Oui, vous devriez appeler la plupart des appels de swing sur l'EDT, mais je ne sais pas si le filetage est le problème pour le moment. Nous devons voir comment vous appelez cette méthode pour vous aider à la corriger car le code ci-dessus ne montre pas l'erreur, mais s'il vous plaît ne suivez pas les conseils de toto ici. Je sais qu'il veut bien dire, mais c'est tout simplement faux. –

+0

Oui, j'étais sur le point d'ajouter un commentaire que ce n'est pas la façon Swing de le faire. Au moins, il identifie le problème. – toto2