![](/img/trans.png)
[英]How to wait for a JFrame thread to finish from inside a JavaFX application?
[英]Exiting WebView which lies inside a JFrame outside JavaFX thread
我有一些代码将Java FX WebView
添加到JFrame。 这非常有效。 一旦用户访问了特定网站,我就会尝试以编程方式关闭此JFrame,首先调用Platform.exit()
然后再调用frame.dispose()
。 只要我从启动WebView
的同一个线程调用此方法,这就可以正常工作。
但是,这正是我想要避免的。 请考虑以下代码(http://pastebin.com/kAjweLi5) 。 此代码尝试在URL更改时关闭程序。 但是,这导致:
IllegalStateException:当工具包未运行时尝试调用延迟( stacktrace )
更新:使用我(非常有限的)调试知识,我意识到exit()
方法似乎成功运行。 堆栈的图像:
(执行黄线时发生错误)
如何在不获取上述异常的情况下从另一个线程/类关闭JFrame?
从以前(修改)的帖子:
public void exit()
{
Platform.runLater( new Runnable(){@Override public void run(){
System.err.println( "exit/runLater/run" );
webEngine.getLoadWorker().cancel();
Platform.exit();
SwingUtilities.invokeLater( new Runnable(){ @Override public void run() {
System.err.println( "exit/invokeLater/run" );
frame.dispose(); }});
}});
}
关闭后台线程是必要的
现在已经很晚了,但这对某些人来说可能会有所帮助。
Platform.runLater(new Runnable() {
@Override
public void run() {
engine.getLoadWorker().cancel();
Platform.setImplicitExit(false);
}
});
我遇到了几个问题,但最后这对我没有任何错误。
我对JavaFX了解不多,但我想这个监听器将在JavaFX线程上执行,这对于Platform.exit()
是有利的,但对于Swing命令frame.dispose()
没有那么多。 您可以尝试将最后一个命令发送到SwingUtilities.invokeLater(...)
。
如果这不起作用,您是否可以尝试从调试器获取有关错误的更多信息,因为堆栈跟踪未链接到代码中的任何行?
目前我没有安装JavaFX,但据我记得你应该使用javafx.application.Platform.runLater(Runnable runable)在GUI上执行任何操作。 JavaFX和Swing不是线程安全的。 所以它应该是:
...
public void exit() {
final Test self = this;
Platform.runLater(new Runnable() {
self.frame.dispose();
});
Platform.exit();
}
...
在处理框架之前关闭平台。 首先处理框架。 在Platform.exit之后,您的应用程序可能处于奇怪状态,某些资源已关闭,某些资源无法访问,...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.