我逐渐了解挥杆和EDT ......
由于EDT是EDT,唯一的,我现在想知道哪些方法,构造函数和任何其他东西都应该在EDT中完成。我知道一般规则,几乎所有创建或与Swing组件交互的代码都必须在事件派发线程上运行,但这是非常通用的。还有人说,任何非线程安全的转码都应该在EDT上执行。但我仍然不知道哪些方法是线程安全的,哪些不是。
我的问题是,是否有最终将在EDT上排队的命令列表? (我之所以这么说,是因为你不必从EDT调用repaint(),但它会在它上面执行从不那么少)。
如果我知道在哪里(并且我可以估计相对于其余代码的时间)我的方法将执行,我可以使代码更有效和可理解。
到目前为止,我的大多数EDT工作都是在黑暗中刺伤,从而制作错误的代码,然后,当我无法弄明白时,通常会让人们在这里烦恼。
那么有一个列表,也许是我错过的Javadocs中的某些内容吗?也许是一些更具体的规则(例如,如果方法的名称中包含“e”,则必须在特定的EDT类型上执行)?
答案 0 :(得分:2)
没有复杂,奇怪和神秘的东西,EDT还活着,直到所有事件都已完成,
如果EDT中的所有事件都已完成,则SwingUtilities.isEventDispatchThread()将返回false,始终
注意Mouse和Keys事件可以为EDT生成一个新事件(一些JComponents在内部对这些事件作出反应,在API中实现通知,向EDT发送新事件,然后EDT处于活动状态,例如容器中的JButton,没有关注来自ButtonModel的触发事件,对Java6有效,从不在Win7和更新版本中,无论是否添加了XxxListener,都必须在没有
的情况下进行测试在所有情况下使用Thread.sleep(int)
Thread.sleep(int)可能导致在sleep()期间丢失所有事件,或仅在Mouse_Hover_Over上刷新Swing GUI
修改
可以创建SecondaryLoop,但我错过了这个界面的真正原因,因为所有事件仍然必须在EDT上完成,多线程可以在Java1.4中创建,与Java7相同
与WinLP for MetalLookAndFeel上的Java6相比,一些线程安全的方法不是线程安全的