私のアプリケーションは、Swingベースです。私はJavaFXのを導入し、セカンダリディスプレイ上のシーンをレンダリングするように設定したいと思います。 私はJFXPanelを握ることができるが、私はJavaFXのAPIでこれを実現したいと思いJFXPanelを保持するためのJFrameを使用することができます。呼び出し元のスレッドがブロックされるのでのJavaFX 2.1:ツールキット初期化されていません
サブクラスcom.sun.glass.ui.ApplicationとApplication.launchを使用して(これは)オプションではありません。
スイングEDTからステージをインスタンス化する場合、私が得るエラーは次のとおりです。
java.lang.IllegalStateException: Toolkit not initialized
任意のポインタ?
EDIT:結論
問題:非自明のSwing GUIアプリケーションは、JavaFXのコンポーネントを実行する必要があります。アプリケーションの起動プロセスは、依存サービスレイヤを起動した後にGUIを初期化します。
ソリューション
サブクラスのJavaFX Applicationクラスと別のスレッドなどでそれを実行します。
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>
がかかるので、1 JavaFX環境が初期化されたことを通知するためにグローバル変数を使用する必要があります。
代替アプローチ:スイングイベントディスパッチャスレッドに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番目の変数に行きました。
NB、それを終了するには、次のとおりです。仕事に推奨される解決策をSwingアプリケーションのJavaFXを使用すると、JFXPanelを作成し、JavaFXシーンをjfxPanel.setScene()メソッドに渡すことができます。 http://docs.oracle.com/javafx/2/api/javafx/embed/swing/JFXPanel.htmlを参照してください。 –
@SergeyGrinev:まあ、コンポーネントによってはJFXPanelで使用されている問題があるため、JavaFX 2を使用する別の方法スイングから高く評価されています。 – dajood
こんにちは。どのコンポーネントに問題がありますか? –