J'utilise des composants AWT tiers dans une application de bureau. La disposition du composant est modifiée dans la méthode paint()
, ce qui provoque un comportement très étrange. Cela semble être corrigé en ajoutant le mot-clé synchronized
à la méthode paint(), mais est-ce une chose sûre à faire?Est-il sécuritaire de synchroniser java.awt.Container.paint (Graphics g)?
Répondre
Il semble que la méthode paint()
soit appelée en dehors du event dispatch thread, ce qui peut en effet provoquer un comportement très étrange, c'est pourquoi cela ne devrait jamais être fait.
Au lieu de paint()
, le code d'application ne doit jamais appeler repaint()
La méthode paint ne doit être appelée qu'au sein d'un thread, le thread Dispatch d'événement, il n'est donc pas nécessaire de synchroniser. J'imagine que la racine du problème réside dans la façon dont les composants sont utilisés. Jetez un oeil à this link pour quelques idées sur la concurrence dans l'interface utilisateur.
Intéressant. Dans mon cas, la synchronisation corrige définitivement des problèmes, si bien qu'elle est appelée depuis plus d'un thread. Je vais enquêter là où cela pourrait se produire. – Armand
D'autres méthodes autorisées à s'exécuter dans différents threads pourraient théoriquement contenir le même verrou. –
@Tom très bon point, et cela explique pourquoi synchroniser paint() a résolu le problème - les choses se passaient dans un autre thread synchronisé qui a changé la mise en page mid-paint. – Armand
Merci Michael. 'paint (Graphics)' était appelé à partir de 'update (Graphics)'. J'ai changé 'update()' alors il appelle maintenant 'repaint()' et il semble fonctionner jusqu'ici ... – Armand
@Michael aucune idée si c'est sûr d'appeler 'repaint()' de 'mise à jour (Graphics)'? – Armand
@Alison: appeler repaint() est sûr, car il ne fait pratiquement que déposer un événement dans la file d'attente EDT, qui est synchronisée correctement. –