HOWTO · Java

JavaのFXアプリケーションスレッドではありません

このチュートリアルでは、Java の Not on FX アプリケーション スレッド エラーについて説明します。

このチュートリアルでは、Java の FX アプリケーション スレッドではありません エラーについて説明します。

JavaのFXアプリケーションスレッドではありません

FX スレッドではなく、FX スレッドから呼び出す必要があるスレッドからメソッドを呼び出そうとすると、FX アプリケーション スレッドではありませんというエラーが発生します。 これは、以前のバージョンの JavaFX では問題ではありませんでした。

これは、JavaFX 8 の新しい実装で発生します。このエラーは、JavaFX アプリケーションの別のスレッドでユーザー インターフェイスを変更すると発生します。

Not on FX application thread エラーをスローする例を次に示します。

Thread DemoThreadShow = new Thread(new Runnable() {
  @Override
  public void run() {
    try {
      newthread.setStyle("visibility: true");
      Thread.sleep(10000);
      Thread.interrupted();
    } catch (Exception e) {
      thread.setText("" + Integer.valueOf(thread.getText()) + 5);
      newthread.setStyle("visibility: false");
    }
  }
});
DemoThreadShow.start();

上記のコードはスレッドを作成し、そのスレッドにいくつかのメソッドを適用します。 これらのメソッドは、JavaFX アプリケーションからのものです。

setText メソッドを適用すると、エラー Exception in thread "Thread-5" java.lang.IllegalStateException: Not on FX application thread; がスローされます。 currentThread = スレッド-5.

この問題を解決するには、コードに次の変更を加えることができます。

  1. FX アプリケーションおよびスレッドで作業中に UI を変更するには、次の方法を使用します。

    Platform.runLater(()
                          -> {
                              // GUI STUFF
                          });
    
    or :
    
        Platform.runLater(new Runnable() {
          @Override
          public void run() {
            // GUI STUFF
          }
        });
    
  2. スレッド の代わりに サービスタスク を使用することもできます。 サービス には スレッド よりも多くの機能があります。

    タスク内で UI を変更しても、FX アプリケーション スレッドではありませんというエラーがスローされることはありません。 この目的で ServiceTask を使用するコード例を次に示します。

    Service New_Service = new Service() {
      @Override
      protected Task createTask() {
        return new Task() {
          @Override
          protected Object call() throws Exception {
            Platform.runLater(()
                                  -> {
                                      // GUI stuff here
                                  });
            return null;
          }
        };
      }
    };
    New_Service.start();
    

    上記のコードは、スレッドよりも便利な方法です。