7
votes

Swing UI ne mettant pas à jour après avoir utilisé invoquater

J'ai une interface utilisateur balançoire Java qui ne met pas à jour / repeindre car je pensais que cela devrait. L'application envoie un message XMPP et reçoit une réponse sur un fil différent. Cette réponse est traitée et l'interface utilisateur est mise à jour pour refléter les informations contenues dans le message.

Lorsque la réponse est reçue, je mettez à jour un composant JPanel à l'aide de P>

javax.swing.SwingUtilities.invokeLater(new Runnable() {
    public void run() { /* execute logic to update panel */ }
});


0 commentaires

3 Réponses :


2
votes

Si vous voulez dire par "Mettre à jour le panneau" que vous ajoutez ou supprimez des composants, vous pouvez mieux utiliser Invalidate () ou REVALIDate () afin que le gestionnaire de mise en page attire les modifications.

voir ici pour un problème similaire.


0 commentaires

2
votes

Si vous ajoutez ou supprimez des composants d'un panneau lors de la manipulation des événements de l'interface graphique (telles que les auditeurs d'action) appelant Dolayout () devrait espérer résoudre votre problème. J'ai trouvé quand l'interface graphique ne met pas à jour, appeler validate (), Dolayout () et Repeindre () a tendance à réparer les choses.


4 commentaires

En fait, vous n'êtes pas censé appeler Dolayout () directement et devriez appeler Revalidate () à la place.


@Stroboskop si vous n'êtes pas censé, la documentation indique "Ceci est généralement appelé lorsque le composant est validé". Et mes expériences suggèrent que lors de l'ajout et de l'élimination des composants d'un conteneur lors de la manipulation des événements, cette méthode n'est pas appelée par REVALIDATE ().


À droite. Étant donné que tout cela se produit dans l'eventeue, il y a de bonnes chances que le drapeau de revalidate ne soit pas examiné avant d'être fait. Mais j'aurais deviné un appel à repeindre () déclencherait la peinture et la mise en page plus tard ...


Merci merci merci! Si ce n'était pas pour cette réponse, je lisais maintenant la ligne de code de la ligne de la mise en page personnalisée. @Stroboskop Je venais d'appeler Revalidate () et repeindre () de mon activeListener, mais le conteneur n'a été mis à jour que lorsque j'ai redimensionné la fenêtre, même lorsque j'ai spammé Revalidate () et repeindre () appels à tous les conteneurs possibles de ce conteneur ... Désormais quand je rencontre des problèmes comme ça, je vais appeler invalidate (), Dolayout (), valider (), revalidate (), repeindre () dans cet ordre.



14
votes

Après avoir ajouté / retirer des composants d'un panneau, vous devez utiliser:

panel.revalidate(); // this works 99% of the time
panel.repaint(); // sometimes needed.


0 commentaires