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



Background

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

问题

要向用户打开 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;
});

问题

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

JavaFX有一种在处理事件的同时阻塞的方法。

爪哇 8

Toolkit.getToolkit().enterNestedEventLoop(key)

爪哇 9

Platform.enterNestedEventLoop(key)

然后可以exitNestedEventLoop另一个线程来解锁,作为奖励,也可以返回一个值。

爪哇 8

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

爪哇 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;
});

最新更新