正在退出WebView,它位于JavaFX线程外的JFrame内
我有一些代码将正在退出WebView,它位于JavaFX线程外的JFrame内,java,oop,webview,jframe,javafx-2,Java,Oop,Webview,Jframe,Javafx 2,我有一些代码将javafxwebview添加到JFrame中。这很有效。一旦用户访问了特定网站,我将尝试通过编程关闭此JFrame,首先调用Platform.exit(),然后调用frame.dispose()。只要我从启动WebView的同一线程调用此方法,这个方法就可以正常工作 然而,这正是我试图避免的。 此代码尝试在URL更改时关闭程序。然而,这导致: IllegalStateException:在工具箱未运行时尝试调用延迟 () 更新: 使用我(非常有限的)调试知识,我意识到exit()
javafxwebview
添加到JFrame中。这很有效。一旦用户访问了特定网站,我将尝试通过编程关闭此JFrame,首先调用Platform.exit()
,然后调用frame.dispose()
。只要我从启动WebView
的同一线程调用此方法,这个方法就可以正常工作
然而,这正是我试图避免的。
此代码尝试在URL更改时关闭程序。然而,这导致:
IllegalStateException:在工具箱未运行时尝试调用延迟
()
更新:
使用我(非常有限的)调试知识,我意识到exit()
方法似乎成功运行。堆栈的图像:
(执行黄线时发生错误)
如何从另一个线程/类关闭JFrame,而不出现上述异常?我对JavaFX不太了解,但我想监听器将在JavaFX线程上执行,这对
平台.exit()
,但对Swing命令frame.dispose()
有好处。您可以尝试将最后一个命令发送到SwingUtilities.invokeLater(…)
如果这不起作用,您能否尝试从调试器获取有关错误的更多信息,因为堆栈跟踪未链接到代码中的任何行?目前我没有安装JavaFX,但据我所知,您应该使用JavaFX.application.Platform.runLater(Runnable Runnable)在GUI上执行任何操作。JavaFX和Swing不是线程安全的。因此,它应该是:
...
public void exit() {
final Test self = this;
Platform.runLater(new Runnable() {
self.frame.dispose();
});
Platform.exit();
}
...
在处理框架之前关闭平台。首先处理框架。在Platform.exit之后,您的应用程序可能处于奇怪的状态,一些资源关闭,一些资源无法访问,来自之前(修订)的帖子:
关闭后台线程是必要的,虽然已经晚了,但这可能对某些人有帮助
Platform.runLater(new Runnable() {
@Override
public void run() {
engine.getLoadWorker().cancel();
Platform.setImplicitExit(false);
}
});
我遇到了几个问题,但最终这对我来说没有任何错误。@sbridges Stacktrace post()以及新的代码示例更好地说明了我的问题。非常感谢您的帮助!嗯,我试着用你的()替换我的
exit()
方法,但是,结果是相同的exteption。(Stacktrace:)…关于您的更新:我现在尝试先处理帧,但没有改变任何内容。非常感谢你迄今为止的帮助!我试图将您的答案与Marek的答案结合起来,结果将我的exit()
方法替换为:。这并没有帮助,但它仍然给出了完全相同的错误(和糟糕的stacktrace)?非常感谢你迄今为止的帮助!由于它是多线程的,所以调试起来很棘手。我会在退出方法的开始处放置一个断点,然后从那里开始。您还可以在代码(穷人的调试器)中添加print语句,以确定哪一行永远不会到达。使用我非常有限的调试技能,我发现Platform.runLater()
和SwingUtilities.invokeLater()
都成功执行。当再次调用exit()
时,似乎会出现问题(?)。。?更新了OP的图片:-)谢谢你的回答。用您的退出方法替换我的退出方法仍然会导致相同的错误。。知道怎么了吗?工作完成了!我把你的代码复制粘贴到我的工作台上,我终于找到了正确的方法:我也不例外……我无法表达我多么感谢你的帮助;这已经困扰我好几天了;-)。万分感谢!!很荣幸,我脸上挂着灿烂的笑容;-)
Platform.runLater(new Runnable() {
@Override
public void run() {
engine.getLoadWorker().cancel();
Platform.setImplicitExit(false);
}
});