EDT的具体方法和其他东西

时间:2013-03-31 20:41:42

标签: java swing event-dispatch-thread

我逐渐了解挥杆和EDT ......

由于EDT是EDT,唯一的,我现在想知道哪些方法,构造函数和任何其他东西都应该在EDT中完成。我知道一般规则,几乎所有创建或与Swing组件交互的代码都必须在事件派发线程上运行,但这是非常通用的。还有人说,任何非线程安全的转码都应该在EDT上执行。但我仍然不知道哪些方法是线程安全的,哪些不是。

我的问题是,是否有最终将在EDT上排队的命令列表? (我之所以这么说,是因为你不必从EDT调用repaint(),但它会在它上面执行从不那么少)。

如果我知道在哪里(并且我可以估计相对于其余代码的时间)我的方法将执行,我可以使代码更有效和可理解。

到目前为止,我的大多数EDT工作都是在黑暗中刺伤,从而制作错误的代码,然后,当我无法弄明白时,通常会让人们在这里烦恼。

那么有一个列表,也许是我错过的Javadocs中的某些内容吗?也许是一些更具体的规则(例如,如果方法的名称中包含“e”,则必须在特定的EDT类型上执行)?

1 个答案:

答案 0 :(得分:2)

  • 没有复杂,奇怪和神秘的东西,EDT还活着,直到所有事件都已完成,

  • 如果EDT中的所有事件都已完成,则SwingUtilities.isEventDispatchThread()将返回false,始终

  • 注意Mouse和Keys事件可以为EDT生成一个新事件(一些JComponents在内部对这些事件作出反应,在API中实现通知,向EDT发送新事件,然后EDT处于活动状态,例如容器中的JButton,没有关注来自ButtonModel的触发事件,对Java6有效,从不在Win7和更新版本中,无论是否添加了XxxListener,都必须在没有

    的情况下进行测试
  • 在所有情况下使用Thread.sleep(int)

  • 调用invokeLater()活动EDT
  • Thread.sleep(int)可能导致在sleep()期间丢失所有事件,或仅在Mouse_Hover_Over上刷新Swing GUI

修改

    Java7中的
  • 可以创建SecondaryLoop,但我错过了这个界面的真正原因,因为所有事件仍然必须在EDT上完成,多线程可以在Java1.4中创建,与Java7相同

  • Java7中的
  • 与WinLP for MetalLookAndFeel上的Java6相比,一些线程安全的方法不是线程安全的