我对摆动和EDT的理解再次继续...

由于EDT是唯一的EDT,所以我现在想知道在EDT中应该完成哪些方法,构造函数和其他任何工作。我知道一般规则,几乎所有创建或与Swing组件进行交互的代码都必须在事件分发线程上运行,但这非常笼统。也有人说任何非线程安全的摆动代码都应在EDT上执行。但是我仍然无法确定哪些方法是线程安全的,哪些不是。

我的问题是,是否存在最终将在EDT上排队的命令列表? (我之所以这样说是因为您不必从EDT调用repaint(),但是它将在其上执行该操作)。

如果我知道我的方法将在何处执行(并且可以据此估算相对于其余代码的时间),那么我可以编写出更高效,更易理解的代码。

到目前为止,我的大部分EDT工作都是在黑暗中刺伤,从而使代码出错,然后,当我无法弄清代码时,通常会惹恼这里的人们。

那么是否有清单,也许是我错过的Javadocs中的清单?也许有一些更具体的规则(例如,如果方法名称中带有“ e”,则必须在特定的EDT类型上执行)?

最佳答案

在所有事件都完成之前,EDT并不存在复杂,奇怪或错误的事物,
如果EDT中的所有事件都已完成,则SwingUtilities.isEventDispatchThread()始终返回false。
注意Mouse和Keys事件可以为EDT生成新事件(某些JComponent在内部对这些事件做出反应,在API中实现的通知程序将新事件触发给EDT,然后EDT仍然存在,例如容器中的JButton且没有Focus触发ButtonModel的事件,对Java6有效,在Win7及更高版本中永远不适用),是否添加了XxxListener都没关系,必须测试
在所有情况下invokeLater()都保持有效的EDT,不包括使用Thread.sleep(int)进行冻结
Thread.sleep(int)可能会导致在sleep()期间丢失所有事件,或者仅在Mouse_Hover_Over上刷新Swing GUI


编辑


在Java7中可以创建SecondaryLoop,但是我想念此接口的真正原因,因为所有事件仍必须在EDT上完成,因此可以在Java1.4中创建与Java7相同的多线程
在Java7中,与用于MetalLookAndFeel的WinXP上的Java6相比,某些线程安全方法不是线程安全的

关于java - EDT的特定方法和其他内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15734302/

10-11 10:51