猿问

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

背景


我有一个Swing应用程序。我运行嵌入在 Swing 应用程序中的JavaFx。我在JavaFx应用程序中运行 Web 浏览器 ( webview ) 。我添加了一个处理程序来接收网络浏览器的功能。此处理程序在JavaFx事件线程中调用。处理程序是同步的,并返回给webview。confirmboolean


问题


要向用户打开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 事件?


DIEA
浏览 218回答 1
1回答

MMTTMM

JavaFX 有一种在处理事件的同时进行阻塞的方法。爪哇 8Toolkit.getToolkit().enterNestedEventLoop(key)爪哇 9Platform.enterNestedEventLoop(key)然后另一个线程可以exitNestedEventLoop解除阻塞,作为奖励,也可以返回一个值。爪哇 8Toolkit.getToolkit().exitNestedEventLoop(key, result)爪哇 9Platform.exitNestedEventLoop(key, result)但是,exitNestedEventLoop从 Swing调用时,您必须切换回 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;});
随时随地看视频慕课网APP

相关分类

Java
我要回答