在 AWT 事件分发线程中使用 SwingUtilities.invokeLater

7

如果你正在修改GUI并且在AWT事件分派线程中(如ActionListener),那么是否应该使用SwingUtilities.invokeLater(Runnable)?


这取决于你想实现什么目标。 - Jeffrey
@Jeffrey 抱歉,我修改了问题。 - Stripies
3
这仍取决于你想要完成什么目标。当你在ActionListeneractionPerformed 方法中时,你正在EDT上运行。然而,在有些情况下,你需要在所有其他监听器完成处理相同事件之后执行某些操作,在这种情况下,你应该使用invokeLater。那么你实际上想要做什么? - Jeffrey
@Jeffrey 主要是 JButton#setEnabled(boolean) 和在 JList 中添加/删除元素。 - Stripies
1个回答

5
您必须始终在事件分派线程(EDT)中执行GUI更新。然而,正如Jeffrey在评论中指出的那样,Swing对象上的ActionListener.actionPerformed方法已经从EDT调用。
如果您只想让JButton看起来启用/禁用或向JList添加/删除项目,并且通过Swing组件上的ActionListener进行这些更改,则不需要显式调用SwingUtilities.invokeLater。

1
如果 OP 试图清除 JTextComponent 或重新定位 JScrollBar,则可能需要使用 invokeLater。但是,由于他只是启用/禁用 JButton 并修改 JList,因此不需要。 - Jeffrey
@Jeffrey 如果我这样做的话,为什么会有必要呢? - Stripies
只要我们仍然在EDT中,使用invokeLater是相当无用的。显然,如果我们想在稍后的时间点运行某些内容,则仍然适用于通常的限制(即仅因为我们从EDT启动线程并不能帮助我们)。 - Voo
1
@Stripies 因为创建 JTextComponent 中的文本的监听器可能会在当前监听器之后被通知。如果是这种情况,您将清除一个尚未包含任何文本的 JTextComponent;这是一个无意义的操作。 - Jeffrey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接