私のアプリケーションはSwingベースです。JavaFXを紹介し、セカンダリディスプレイにシーンをレンダリングするように構成したいと思います。JFrameを使用してJFXPanelを保持できるJFXPanelを保持できますが、JavaFXAPIを使用してこれを実現したいと思います。
com.sun.glass.ui.Applicationをサブクラス化し、Application.launch(this)を使用することは、呼び出し元のスレッドがブロックされるため、オプションではありません。
Swing EDTからステージをインスタンス化すると、次のエラーが発生します。
java.lang.IllegalStateException: Toolkit not initialized
ポインタはありますか?
編集:結論
問題:重要なSwingGUIアプリケーションはJavaFXコンポーネントを実行する必要があります。アプリケーションの起動プロセスは、依存するサービスレイヤーを起動した後にGUIを初期化します。
ソリューション
JavaFXアプリケーションクラスをサブクラス化し、別のスレッドで実行します。例:
public class JavaFXInitializer extends Application {
@Override
public void start(Stage stage) throws Exception {
// JavaFX should be initialized
someGlobalVar.setInitialized(true);
}
}
補足:Application.launch()メソッドはClass<? extends Application>
引数としてをとるため、JavaFX環境が初期化されたことを通知するためにグローバル変数を使用する必要があります。
別のアプローチ:Swing Event DispatcherスレッドでJFXPanelをインスタンス化します:
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new JFXPanel(); // initializes JavaFX environment
latch.countDown();
}
});
latch.await();
このアプローチを使用することにより、呼び出しスレッドはJavaFX環境がセットアップされるまで待機します。
適切と思われるソリューションを選択してください。JavaFX環境の初期化を通知するためのグローバル変数を必要とせず、スレッドを無駄にしないため、2番目のものを使用しました。