等待Swing对话框结果时在JavaFX中阻塞

时间:2018-09-02 12:21:48

标签: java swing javafx

背景

我有一个 Swing 应用程序。我运行嵌入在swing应用程序中的 JavaFx 。我在 JavaFx 应用程序中运行Web浏览器( webview )。我添加了一个处理程序来接收Web浏览器的confirm函数。此处理程序在 JavaFx 事件线程中调用。处理程序是同步的,并将boolean返回到 webview

问题

要向用户打开 Swing 对话框,我需要在 Swing 事件线程上运行,但仅在响应对话框后从JavaFx回调返回。

这是我的回叫示例

engine.setConfirmHandler(()->{
   // in JavaFX context
   CountdownLatch latch = new CountdownLatch(1);

   SwingUtilities.invokeLater(()->{
      // in Swing context
      showModalDialog();
      latch.countDown();
   });

   // Wait for latch
   // HOW DO I BLOCK HERE AND STILL PROCESS EVENTS IN JAVAFX/SWING?
   return result;
});

问题

如何在不关闭 JavaFX Swing 上下文中阻止UI事件的同时,延迟从回调返回,直到对话框关闭?

1 个答案:

答案 0 :(得分:0)

JavaFX可以在仍然处理事件的同时进行阻止。

Java 8

Toolkit.getToolkit().enterNestedEventLoop(key)

Java 9

Platform.enterNestedEventLoop(key)

然后,另一个线程可以exitNestedEventLoop进行解锁,并且作为奖励,还可以返回一个值。

Java 8

Toolkit.getToolkit().exitNestedEventLoop(key, result)

Java 9

Platform.exitNestedEventLoop(key, result)

但是,从Swing调用exitNestedEventLoop时,必须切换回JavaFX上下文。

这是工作示例( Java 8 )。

engine.setConfirmHandler(()->{
   // in JavaFX context

   SwingUtilities.invokeLater(()->{
      // in Swing context
      boolean result = showModalDialog();
      Platform.runLater(()->{
          // back to JavaFX context
          Toolkit.getToolkit().exitNestedEventLoop(key, result)
      })
   });

   // Wait for result
   boolean result = Toolkit.getToolkit().enterNestedEventLoop(this)
   // still in JavaFX context
   return result;
});