有没有办法在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操作方法在同一方法中有两个服务器调用