1

我有一些将 a 添加Java FX WebView到 JFrame 的代码。这很好用。一旦用户访问了一个特定的网站,我就会尝试以编程方式关闭这个 JFrame,首先是调用Platform.exit(),然后是frame.dispose(). 只要我从WebView启动的同一个线程调用此方法,它就可以正常工作。

但是,这是我试图避免的。考虑以下代码 (http://pastebin.com/kAjweLi5)。此代码尝试在 URL 更改时关闭程序。但是,这会导致:

IllegalStateException:在工具包未运行时尝试调用 defer ( stacktrace )

更新:使用我(非常有限的)调试知识,我意识到该exit()方法似乎成功运行。堆栈的图像:

在此处输入图像描述

(黄线执行时出现错误)

如何在不出现上述异常的情况下从另一个线程/类关闭 JFrame?

4

4 回答 4

2

从以前(修改)的帖子:

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(); }});
      }});
}

需要关闭后台线程

于 2012-10-13T14:12:15.153 回答
1

已经很晚了,但这可能对某人有帮助。

    Platform.runLater(new Runnable() {

        @Override
        public void run() {
            engine.getLoadWorker().cancel();    
            Platform.setImplicitExit(false);
        }
    });

我遇到了几个问题,但最后这对我有用,没有任何错误。

于 2015-04-07T10:42:30.280 回答
0

我对JavaFX不太了解,但我猜监听器会在JavaFX线程上执行,这对Swing命令有好处Platform.exit(),但对Swing命令没有那么多frame.dispose()。您可以尝试将最后一个命令发送到SwingUtilities.invokeLater(...).

如果这不起作用,您是否可以尝试从调试器获取有关错误的更多信息,因为堆栈跟踪未链接到代码中的任何行?

于 2012-10-13T12:01:14.427 回答
0

目前我没有安装 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 之后,您的应用程序可能会处于奇怪的状态,一些资源已关闭,一些无法访问,......

于 2012-10-13T12:02:46.940 回答