2010-05-18 6 views

Répondre

3

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

+0

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

+0

@Michael aucune idée si c'est sûr d'appeler 'repaint()' de 'mise à jour (Graphics)'? – Armand

+0

@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. –

1

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.

+0

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

+1

D'autres méthodes autorisées à s'exécuter dans différents threads pourraient théoriquement contenir le même verrou. –

+0

@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