2

投稿を読みました: JavaFx 2.x-Swing:FXアプリケーションスレッドではありません

「スレッド「AWT-EventQueue-0」の例外」を参照してjava.lang.IllegalStateException:ツールキットが初期化されていません

ここで議論を見つけましたJavaFX2.1:ツールキットが初期化されていません

しかし、私はソリューションを使用することができません

「SwingイベントディスパッチャスレッドでJFXPanelをインスタンス化する:」

それは未定義の時間待機しているからです。

JDesktopPane内でJInternalFrameを使用しても同じ問題が発生します。

私はもう試した:

final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
  @Override
  public void run() {
    final JFXPanel javafxPanel = new JFXPanel();
    latch.countDown();       
    BorderPane pane = new BorderPane();
    javafxPanel.setScene( new Scene(pane) {
      Text text = new Text("Hello World");            
    });
    frame.getContentPane().add(javafxPanel, BorderLayout.CENTER);
  }
});        
this.add(frame);
try {
    latch.await();
} catch (InterruptedException ex) {
    System.out.println("err");
    Logger.getLogger(WorkspacePanel.class.getName()).log(Level.SEVERE, null,     ex);
}

ここで、frameはJInternalFrameであり、これはJDesktopPaneです。

何か助けはありますか?前もって感謝します。

4

1 に答える 1

2

それは未定義の時間待機しているからです。

この待機は、によって引き起こされる可能性がありlatchます。投稿したコードがイベントディスパッチスレッドでトリガーされた場合、latch.await()呼び出しはEDTをブロックし、EDTに投稿したコードがRunnable実行されないようにするため、latch.countDown()ステートメントに到達することはありません。メソッドを使用してこれをすばやく確認できますEventQueue.isDispatchThread

イベントディスパッチスレッドでアクセス/変更/作成/...する必要があるSwingコンポーネントを使用しているため、CountDownLatch別のコードでそのコードを実行することはできないため、単に削除することを強くお勧めします。Thread

さらに、ラッチを削除すると、リンクされた質問と同じ例外が発生します。The

javafxPanel.setScene( new Scene(pane) {
  Text text = new Text("Hello World");            
});

イベントディスパッチスレッドではなく、JavaFXスレッドで実行する必要があります。それを解決する方法については、その質問に対する私の答えを参照してください。

于 2012-08-31T07:35:13.350 に答える