我知道通过使用这个方法,runnable参数被提交给系统EventQueue。但是所有的GUI更新都应该使用这种方法吗?我的意思是,如果我想说,更改JButton的文本,我应该使用这样的东西:
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
jButton1.setText("changed text");
}
});
如果我使用这种方法,有什么模式可以用来避免这种重复的代码吗?
发布于 2010-08-22 12:13:50
只有当您想要从另一个不是UI线程(事件分派线程)的线程更新UI时,才需要使用invokeLater
。
假设您有一个用于按钮单击的处理程序,并且您希望在有人单击按钮时更改标签的文本。然后,它是完美保存设置标签文本直接。这是可能的,因为按钮单击事件的处理程序在UI线程中运行。
但是,假设在单击另一个按钮时,您启动了另一个执行某些工作的线程,并且在此工作完成后,您想要更新UI。然后使用invokeLater
。此方法可确保在UI线程上执行UI更新。
所以在很多情况下,你不需要invokeLater
,你可以直接进行UI更新。如果不确定,可以使用isDispatchThread
检查当前代码是否在事件分派线程内运行。
发布于 2010-08-22 12:19:32
只有当您还没有在事件分派线程上时,才需要这样做。除非您已经从主线程启动了新的线程或执行了代码,否则所有代码都可能已经从事件分派线程运行了,因此这是不必要的。例如,所有UI事件处理程序都是在事件分派线程上调用的,因此您不需要为从那里调用的代码执行此操作。
发布于 2011-09-16 03:34:47
您可以使用Eclipse的模板特性,而不是真正避免“重复”(java人可能会说,没有很多秘密的可读代码)。我将其设置为将两个字母"il“扩展到以下代码块:
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
// do something.
} catch (Exception e) {
e.printStackTrace();
}
}
});
显然,这种调度队列设计不仅是推荐的,而且是基本必需的。这可能是我在任何语言中见过的将lambda推送到消息队列中的最嘈杂的方式。但事实就是如此。这是java。在Java的辩护中,从上面可以明显看出到底发生了什么。我确实讨厌大量的输入,但我能想到的唯一可以避免的就是C预处理器宏,我敢打赌Java人不喜欢使用它们。通过模板进行代码扩展更具可读性和可支持性,并且不涉及任何黑魔法。
https://stackoverflow.com/questions/3541373
复制