【问题标题】:JDialog in new thread doesn't respond新线程中的 JDialog 没有响应
【发布时间】:2011-12-07 15:05:29
【问题描述】:

我想在另一个线程中创建一个 JDialog(将显示时间), 在主线程中,将运行一个函数..

当我创建对话框时,它会显示出来,但它“卡住”了……我看不到 它的组件...

仅当主线程中的函数完成时-对话框正确显示..

我该如何解决?

【问题讨论】:

  • 请添加一些关于如何创建它的代码。
  • 我们需要更多代码,但我猜你可能不知道与 Swing 相关的所有内容都应该在事件调度线程 (Swing EDT) 中运行。

标签: java multithreading swing jdialog


【解决方案1】:

如果您在 Swing EDT 上运行大型任务,那么它将阻止 UI 元素被重新绘制,因为这是所有 Swing 绘制发生的线程。

解决此问题的唯一明智方法是在单独的线程上运行大型任务。查看SwingWorker类:http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html

【讨论】:

    【解决方案2】:

    在 SwingUtilities.invokeLater 或 invokeAndWait 中调用 JDialog 创建

    【讨论】:

      【解决方案3】:

      您需要使用 awt 事件队列来打开它。据我所知,仅将其放在单独的线程上是行不通的

      必须在另一个线程上启动人脸编辑器才能使 JFrame 菜单和加速器工作,

          java.awt.EventQueue.invokeLater(new Runnable() {
      
              @Override
              public void run() {
                  editFace();
              }
          });
      

      editFace() 包含启动和显示新框架的代码

                  Viewer2D v = new Viewer2D(this);
                  this.addFaceEditor(FaceToEdit, v);
                  v.DrawFace(FaceToEdit);
                  v.showAndRaise();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多