2011-02-23 2 views
4

Dans mon application Swing, lorsque je retire un JOGLGLCanvas de mon composant principal pour ajouter un DPanel au même place, il y a quelques problèmes d'affichage: Pendant le temps où l'ancien composant a été supprimé et avant que le nouveau n'a été ajouté, les images rémanentes de tous les menus contextuels qui ont été précédemment affichés sur le GLCanvas sont visibles sur l'arrière-plan de l'élément principal.Java Swing: Rémanence lors de la suppression d'un composant jogl poids lourd pour ajouter un composant léger au même endroit

Comment puis-je éviter cela?

Répondre

5

Lors de l'ajout/suppression de composants à partir d'une interface graphique visible le code devrait ressembler à:

panel.remove(...); 
panel.add(...); 
panel.revalidate(); 
panel.repaint(); 

En outre, le code doit exécuter sur le thread de répartition des événements. Si le code est exécuté à partir d'un écouteur, il est sur l'EDT. Si le code est exécuté en dehors d'un écouteur, vous devez probablement utiliser un SwingWorker ou un SwingUtilities.invokeLater().

+0

Je pense que revalider lui-même organise le repaint nécessaire, de sorte que vous ne devez pas appeler cela aussi. La partie la plus importante est l'EDT, cependant. –

+0

Il y a des moments où le repeint est absolument essentiel, en particulier lors de la suppression de composants, alors revalider est souvent insuffisant. –

+0

Désolé, je n'ai pas été assez précis dans ma question ... Je sais qu'il est nécessaire de le faire dans l'EDT ... Ce n'est pas suffisant quand on mélange des composants poids lourds jogl avec des composants swing légers. J'ai édité ma question pour être plus précis. – jumar

Questions connexes