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
Antwort
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, 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
@ Jeffrey Warum wäre es notwendig gewesen, wenn ich das getan hätte? – Stripies
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
Es hängt davon ab, was Sie erreichen möchten. – Jeffrey
@ Jeffrey Sorry, ich habe die Frage bearbeitet. – Stripies
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