背景
我有一个 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事件的同时,延迟从回调返回,直到对话框关闭?
答案 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;
});