我们是否应该在Java桌面应用程序中使用EventQueue.invokeLater进行任何GUI更新?

nas*_*ash 16 java swing thread-safety

我知道通过使用此方法,runnable参数将提交给系统EventQueue.但是,如果使用此方法完成所有GUI更新吗?我的意思是,如果我想说,更改JButton的文本,我应该使用这样的东西:

java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
         jButton1.setText("changed text");
      }
});
Run Code Online (Sandbox Code Playgroud)

如果我应该使用这种方法,我们可以使用任何模式来避免这种重复的代码?

Ron*_*erg 26

只需要在invokeLater另一个不是UI线程的线程(事件调度线程)中更新UI时,就需要使用.

假设您有按钮单击的处理程序,并且您希望在有人单击按钮时更改标签的文本.然后直接设置标签文本就完全可以了.这是可能的,因为按钮单击事件的处理程序在UI线程中运行.

但是,假设在另一个按钮单击时启动另一个执行某些工作的线程,在完成此工作后,您需要更新UI.然后你用invokeLater.此方法可确保在UI线程上执行UI更新.

因此,在很多情况下,您不需要invokeLater,您可以直接进行UI更新.如果您不确定,可以使用isDispatchThread检查当前代码是否在事件派发线程内运行.