繁体   English   中英

退出位于JavaFX线程之外的JFrame内的WebView

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM