有没有办法在javafx线程上执行“wait()”,暂停执行方法,直到后台任务完成但允许javafx线程继续 .

我找到了一种方法来做这样的事情

. Toolkit.getToolkit()enterNestedEventLoop(键);和Toolkit.getToolkit() . exitNestedEventLoop(key,value);

想象一下,当用户单击按钮并在该方法内部(在FX线程上运行)时,您有一个@FXML操作方法我想要执行以下操作:

1从javafx observable属性中获取值2禁用屏幕区域并显示进度指示器3在服务器上调用长时间运行的任务并在此处停止执行操作方法而不阻止UI(或换句话说,让当后台任务运行时用户导航到另一个屏幕)4继续这里fx线程重新启用ui并隐藏进度指示器5用服务器返回的值更新UI .

我知道可以使用javafx任务来实现类似的东西,但这需要将4和5移动到javafx任务的suceeded()方法,这不是我想要的 .

我们有一个框架允许开发人员使用@Background注释在javafx控制器上注释一些远程服务存根,并用jdk动态代理替换这些存根,该代理将所有调用切换到存根中的任何方法以在非javafx线程并在服务器调用完成后继续4,因此我们不必用javafx线程同步代码填充我们的代码 .

Toolkit.getToolkit() . enterNestedEventLoop(key);和Toolkit.getToolkit() . exitNestedEventLoop(key,value);在大多数情况下效果很好,除了在某些情况下:

  • 如果在应用程序启动时在javafx线程上发生调用(在启动时预先填充带有服务器数据的屏幕)

  • 如果@FXML操作方法在同一方法中有两个服务器调用