「JavaFXアプリケーションスレッド」ではないスレッドでjavafx.scene.control.Tooltipを作成する方法はありますか?
パフォーマンスのために、1 つのスレッドでいくつかのビジュアル要素を準備し、それらをメモリに保持します。そして、それらが必要なときは、それらを表示するためにアプリケーション スレッドを使用します。しかし、 new Tooltip() はアプリケーション スレッドのみを必要とするようです。
「JavaFXアプリケーションスレッド」ではないスレッドでjavafx.scene.control.Tooltipを作成する方法はありますか?
パフォーマンスのために、1 つのスレッドでいくつかのビジュアル要素を準備し、それらをメモリに保持します。そして、それらが必要なときは、それらを表示するためにアプリケーション スレッドを使用します。しかし、 new Tooltip() はアプリケーション スレッドのみを必要とするようです。
「JavaFXアプリケーションスレッド」ではないスレッドでjavafx.scene.control.Tooltipを作成する方法はありますか?
JavaFX 2.2 の場合 - いいえ。
この JavaFX イシュー トラッカー チケットを参照してください: Tooltip of Tab (およびその他のコントロール) を FXApplicationThread に設定することはできません。
チケットには、Platform.runLater呼び出しでツールチップを作成するための推奨される回避策があります。
package fxthread_25127_wrongthread;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.control.Tooltip;
import javafx.stage.Stage;
/**
*
* @author mickf
*/
public class Main extends Application {
Tooltip tooltip;
public static void main(String[] args) {
Application.launch(args);
}
@Override public void init() throws Exception {
Platform.runLater(new Runnable() {
@Override public void run() {
tooltip = new Tooltip("Top tip : use runLater()");
}
});
/*
* this will cause an ISE
*/
//tooltip = new Tooltip("flip");
}
@Override public void start(Stage s) {
System.exit(0);
}
}
Platform.runLater が javadoc からどのように機能するかの説明:
指定された Runnable を JavaFX アプリケーション スレッドで将来の不特定の時点で実行します。任意のスレッドから呼び出すことができるこのメソッドは、Runnable をイベント キューにポストし、すぐに呼び出し元に戻ります。Runnables は、ポストされた順序で実行されます。runLater メソッドに渡された runnable は、runLater への後続の呼び出しに渡された Runnable の前に実行されます。