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

2022-09-03 00:42:45

我知道通过使用此方法,可运行的参数被提交到系统事件队列。但是,是否应使用此方法完成所有 GUI 更新?我的意思是,如果我想说,改变JButton的文本,我应该使用这样的东西:

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

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


答案 1

仅当要从另一个不是 UI 线程(事件调度线程)的线程更新 UI 时,才需要使用 invokeLater

假设您有一个用于按钮单击的处理程序,并且您希望在有人单击按钮时更改标签的文本。然后,直接设置标签文本即可完全保存。这是可能的,因为按钮单击事件的处理程序在 UI 线程中运行。

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

所以在很多情况下,你不需要,你可以直接做UI更新。如果不确定,可以使用 isDispatchThread 检查当前代码是否在事件调度线程内运行。invokeLater


答案 2

仅当您尚未在事件调度线程上时,才需要执行此操作。除非您已启动新线程或从主线程执行代码,否则所有代码可能都已从事件调度线程运行,因此没有必要这样做。例如,所有 UI 事件处理程序都在事件调度线程上调用,因此您无需对从那里调用的代码执行此操作。


推荐