1

Java FX WebViewJFrameにを追加するコードがあります。これはうまくいきます。Platform.exit()ユーザーが特定のWebサイトにアクセスしたら、最初にを呼び出してから、を呼び出して、このJFrameをプログラムで閉じようとしてい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 はインストールされていませんが、覚えている限り、GUI で操作を実行するには javafx.application.Platform.runLater(Runnable runable) を使用する必要があります。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 に答える
0

JavaFX についてはよくわかりませんが、リスナーは JavaFX スレッドで実行されると思います。これは には適していPlatform.exit()ますが、Swing コマンドにはあまり適していませんframe.dispose()。最後のコマンドを に送信してみてくださいSwingUtilities.invokeLater(...)

それでも問題が解決しない場合は、スタック トレースがコード内のどの行にもリンクされていないため、デバッガーからエラーに関する詳細情報を取得してみてください。

于 2012-10-13T12:01:14.427 に答える