2012-07-18 1 views
0

Lorsque je repeigne() le panneau sur lequel je place mes JLabels, j'obtiens des erreurs, mais cela fonctionne toujours. J'ai essayé de mettre le panel.repaint(); code dans une déclaration try et cela n'a pas aidé. Quelqu'un d'autre a des problèmes avec repaint() pour JPanels?Appeler repaint() pour JPanels

Message d'erreur (copié dans les commentaires):

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 21 
at java.awt.Container.getComponent(Unknown Source) 
at javax.swing.JComponent.rectangleIsObscured(Unknown Source) 
at javax.swing.JComponent.paint(Unknown Source) 
at javax.swing.JComponent.paintToOffscreen(Unknown Source) 
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source) 
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)) 
+2

Savez-vous ce que sont les erreurs? –

+0

Quelles sont les erreurs? Dessinez-vous sur le panneau? Si c'est le cas, prenez en compte la méthode paintComponent qui remplace la méthode paint et assurez-vous de toujours appeler super.paintComponent (g); –

+0

le message d'erreur est trop grand pour un commentaire Part1 Exception dans le thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: Aucun enfant: 21 \t à java.awt.Container.getComponent (Source inconnue) \t à javax.swing.JComponent.rectangleIsObscured (Source inconnue) \t à javax.swing.JComponent.paint (Source inconnue) \t à javax.swing.JComponent.paintToOffscreen (Source inconnue) \t à javax.swing.RepaintManager $ PaintManager .paintDoubleBuffered (source inconnue) \t à javax.swing.RepaintManager $ PaintManager.paint (source inconnue) ) –

Répondre

1

Assurez-vous que toutes les modifications apportées à l'interface utilisateur sont effectuées dans le fil d'envoi des événements, ce qui inclut l'ajout et le retrait de composants des conteneurs. Comme l'indique Leon, l'utilisation de la méthode invokeLater garantit que les opérations sont correctement effectuées sur l'EDT.

+0

Comment fonctionne la méthode invokeLater, et comment l'implémenter? –

+1

InvokeLater place fondamentalement un objet Runnable dans la file d'attente ETD, lui permettant d'être exécuté ultérieurement (dans ETD). Fondamentalement, vous devez appeler SwingUtilities.invokeLater (...) et passer un Object qui implémente l'interface Runnable. Lorsque l'ETD traite la file d'attente, il appelle la méthode "run". – MadProgrammer

+1

Vous pouvez consulter http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html pour plus de détails – MadProgrammer

2

Je ne suis pas sûr, mais je pense que je suis tombé sur le même problème avant. Je croyais utiliser SwingUtilities.invokeLater m'a aidé soutenu alors. Faites un essai, je ne suis pas exactement sûr.