为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2021-08-25 17:24:36
背景我有一个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 事件?
查看完整描述

1 回答

?
MMTTMM

TA贡献1869条经验 获得超4个赞

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


爪哇 8


Toolkit.getToolkit().enterNestedEventLoop(key)

爪哇 9


Platform.enterNestedEventLoop(key)

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


爪哇 8


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

爪哇 9


Platform.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;

});


查看完整回答
反对 回复 2021-08-25
  • 1 回答
  • 0 关注
  • 217 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号