java - 我们应该为 Java 桌面应用程序中的任何 GUI 更新使用 EventQueue.invokeLater 吗?

标签 java swing thread-safety

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

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

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

最佳答案

你只需要使用invokeLater当您想从另一个不是 UI 线程(事件调度线程)的线程更新您的 UI 时。

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

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

所以在很多情况下,你不需要invokeLater,直接更新UI即可。如果不确定,可以使用 isDispatchThread检查您当前的代码是否在事件分派(dispatch)线程内运行。

关于java - 我们应该为 Java 桌面应用程序中的任何 GUI 更新使用 EventQueue.invokeLater 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3541373/

相关文章:

java - 创建包含 ";"字符的 cookie

java - java 8 设置中捆绑的 JavaDB

java - 我可以在 Java Swing 上使用 websocket 吗?

java - 使用 JProgressBar 将数组内容复制到 JTextArea 的进度

java - 如何访问动态创建的元素(JAVA)?

需要 Java Singleton 解释

java - 访问新的框架方法

java - 我不明白为什么java中的不可变对象(immutable对象)本质上总是线程安全的

c++ - 具有并发值的 HashMap (在 C++ 中)

java - 如何在单元测试中忽略 @PreAuthorize ("isAuthenticated()") 注释?