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.
この問題を解決するには、コードに次の変更を加えることができます。
-
FX アプリケーションおよびスレッドで作業中に UI を変更するには、次の方法を使用します。
Platform.runLater(() -> { // GUI STUFF }); or : Platform.runLater(new Runnable() { @Override public void run() { // GUI STUFF } }); -
スレッドの代わりにサービスとタスクを使用することもできます。サービスにはスレッドよりも多くの機能があります。タスク内で UI を変更しても、
FX アプリケーション スレッドではありませんというエラーがスローされることはありません。 この目的でServiceとTaskを使用するコード例を次に示します。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();上記のコードは、スレッドよりも便利な方法です。