2014-09-25 106 views
0

我想了解此线程的真正目的。 我已阅读书籍,文章,但没有明确说明EventQueue线程负责的内容。我见过很多例子,有时候会用到,有时候不会。据我所知,这个线程负责所有的GUI操作,比如创建窗口,组件,从OS API调用本地函数等等。所以每次我改变GUI的一部分时,我都应该把这个动作传递给队列。 所以使用队列应用程序默认有两个线程主线程和事件分派线程。所以我所有的bussines逻辑都应该在主线程中执行(或者从main创建新线程)以及EventQueue中的所有GUI操作(例如向表中添加新项目,更改标签更新列表中的文本)。还有,我应该在EventQueue中创建主窗口的实例(class extends jframe)?Java Swing中的EventQueue.invokeLater

我对不对?如果没有请解释。谢谢大家提前。

+2

在事件处理程序线程中调用所有事件_handlers_。所以,如果你为一个按钮编写一个动作监听器,那么actionPerformed()方法将在点击按钮时在事件处理线程中被调用。如果按钮的操作不需要很长时间,则可以直接在actionPerformed()内调用Swing方法。在这种情况下无需“invokeLater()”。 – 2014-09-25 17:35:54

回答

2

这听起来像你有它的要点,是的。如果您的应用程序本质上是“纯粹的GUI”,那么您可以在EDT上执行所有操作(Event Dispatch Thread,它是运行您传递给EventQueue.invokeLater的任何内容的线程),但是您必须在EDT上创建窗口,这意味着您的main()方法必须使用EventQueue.invokeLater至少一次。

因为GUI对象上的所有侦听器都会在EDT上得到通知,所以您通常不需要在处理程序中使用EventQueue.invokeLater

+0

因此,例如,如果我在EDT中创建JFrame,则可以在不将任何操作传递给队列的情况下执行其他所有操作,例如添加项目?由于主框架是在EDT中创建的,所有未来的操作都将在EDT中执行? – ketazafor 2014-09-25 16:46:42

+0

只要你的'其他东西'作为GUI回调运行,那么是的,你很好。 – davmac 2014-09-26 09:27:37