Java Swing - 在 EDT 上运行

标签 java swing event-dispatch-thread

我有几个关于 Swing 和使用 EDT 进行 GUI 更新的问题。我刚开始阅读这些东西,所以我是这个领域的初学者:

  1. 需要在 EDT 上运行哪些操作?如果他们不这样做,是否只是引发异常?
  2. 是否有任何特定时间我们实际上会自动进入 EDT?
  3. 如果我们使用 SwingUtilities.invokeLater 安排任务,我们会将其排入当前 GUI 更新任务队列 (EDT),对吧?
  4. 对上述队列的访问我猜是同步的,或者使用了一些并发集合,但是如果我从两个后台线程调度两个GUI更新任务,就不可能说先添加哪个?例如,如果线程 1 首先提交将 JLable 的文本设置为"is"的任务,然后不久之后,第二个线程出现并提交将该值设置为“否”的任务,我们是否保证结果将是"is",或者仅仅是操作系统如何安排这些事情的问题?
  5. SwingWorker 如何确保 done() 方法在 EDT 上运行?它设置了以下代码:

      future = new FutureTask<T>(callable) {
                   @Override
                   protected void done() {
                       doneEDT();
                       setState(StateValue.DONE);
                   }
               };
    

所以我想知道 FutureTask 是否以某种方式确保 invokeLater 被调用?

感谢您的所有回答。

最佳答案

  1. 一个好的规则是所有操作(访问/更新/...)都应该在 EDT 上发生。 javadoc 中提到了一些异常(exception)情况(某些类的某些方法),但它们很难记住,因此更容易坚持“在 EDT 上做所有事情”的方法。不会引发异常(幸运的是,JavaFX 修复了这个缺点)。您可以使用自定义 RepaintManager 来检测其中的大部分违规行为:请参阅 this article .

  2. 用户触发的一切都在 EDT 上处理。例如,如果用户点击一个按钮,相应的 ActionactionPerformedActionListener 将在 EDT 上被调用。

  3. 正确

  4. 您首先安排的事情将首先执行。 invokeLater 调用只是将 Runnable 添加到队列的末尾。稍后第二次使用 invokeLater 将在先前计划的 Runnable 之后添加这个新的 Runnable

  5. 查看doneEDT

    的代码
     private void doneEDT() {
         Runnable doDone = 
             new Runnable() {
                 public void run() {
                     done();
                 }
             };
         if (SwingUtilities.isEventDispatchThread()) {
             doDone.run();
         } else {
             doSubmit.add(doDone);
         }
     }
    

关于Java Swing - 在 EDT 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11825281/

相关文章:

Java 语法 expression.new MyClass

带有形状体积和面积类的 Java 接口(interface)

java - 如何添加关闭 Java 程序的 JMenuItem?

ios - UILabel 值未在 Parse block 内更新

java - Java中共享变量的顺序使用

java - 发送 POST 并读取流响应

java - 找不到参数的方法实现() [DefaultExternalModuleDependency{group ='com.google.firebase' ,

java - JScrollPane 滚动条在 JEditorPane.setText() 上向下跳转

java - JTable 编辑/取消编辑代码不适用于重新排列的 JTable 列

Java:在等待另一个线程完成时更新 UI