2012-05-14 5 views
6

Sollten Sie SwingUtilities.invokeLater(Runnable) verwenden, wenn Sie die GUI ändern und Sie sind in der AWT Event Dispatching Thread, wie ein ActionListener?SwingUtilities.invokeLater in AWT Ereignis Dispatching Thread

+0

Es hängt davon ab, was Sie erreichen möchten. – Jeffrey

+0

@ Jeffrey Sorry, ich habe die Frage bearbeitet. – Stripies

+3

Es hängt immer noch davon ab, was Sie erreichen möchten. Wenn Sie sich in der 'actionPerformed'-Methode eines' ActionListener' befinden, befinden Sie sich im EDT. Es gibt jedoch einige Fälle, in denen Sie eine Aktion ausführen müssen, nachdem alle anderen Listener das gleiche Ereignis verarbeitet haben. In diesem Fall sollten Sie 'invokeLater' verwenden. Also, was versuchst du eigentlich zu tun? – Jeffrey

Antwort

5

Sie müssen im Event Dispatch Thread (EDT) immer GUI-Aktualisierungen vornehmen. Wie jedoch Jeffrey in den Kommentaren hervorhebt, ist die ActionListener.actionPerformed-Methode für ein Swing-Objekt bereits, das vom EDT aufgerufen wird.

Wenn Sie einfach die JButton aussehen sollen aktiviert/unenabled oder zum Hinzufügen/Entfernen von Elementen aus einem JList und Ihre jenen Änderungen über eine ActionListener auf einer Swing-Komponente zu machen, dann sollten Sie nicht SwingUtilities.invokeLater explizit aufgerufen haben.

+1

+1, Wenn das OP versuchte, eine 'JTextComponent' zu löschen oder eine' JScrollBar' neu zu positionieren, war 'invokeLater' möglicherweise notwendig. Aber da er nur eine 'JButton' aktiviert/deaktiviert und eine' JList' modifiziert, ist dies nicht der Fall. – Jeffrey

+0

@ Jeffrey Warum wäre es notwendig gewesen, wenn ich das getan hätte? – Stripies

+0

Solange wir in der EDT sind, ist die Verwendung von 'invokeLater' ziemlich nutzlos. Wenn wir etwas zu einem späteren Zeitpunkt ausführen wollen, gelten natürlich die gleichen Einschränkungen wie üblich (d. H. Nur weil wir einen Thread vom EDT starten, hilft uns überhaupt nicht). – Voo

Verwandte Themen