Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在退出WebView,它位于JavaFX线程外的JFrame内_Java_Oop_Webview_Jframe_Javafx 2 - Fatal编程技术网

正在退出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);
        }
    });