2012-08-31 35 views
1

我讀過一篇: JavaFx 2.x - Swing : Not on FX application thread的JavaFX在揮杆例外「工具包未初始化」

參照「 異常線程‘AWT-EventQueue的 - 0’java.lang.IllegalStateException:工具包未初始化」

我發現這裏的討論JavaFX 2.1: Toolkit not initialized

,但我不能夠使用該解決方案

「Istantiate JFXPanel在Swing事件分派線程:」

因爲它保持未定義的時間等待。

我有使用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); 
} 

如果幀是JInternalFrame的,這是一個JDesktopPane中。

任何幫助?提前致謝。

回答

2

因爲它保持未定義的時間等待。

此等待可能是由latch造成的。如果您發佈的代碼在「事件調度線程」中觸發,latch.await()調用將阻止EDT並確保您在EDT上發佈的Runnable永遠不會執行,因此latch.countDown()語句永遠不會被執行。您可以使用方法EventQueue.isDispatchThread快速檢查。

我強烈建議簡單地刪除CountDownLatch,如運行在另一個Thread代碼是不是一種選擇,因爲你用Swing組件,應該訪問/修改/創建/ ......在事件指派線程工作。

此外,一旦您刪除了閂鎖,您將遇到與linked question中相同的異常。

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

必須在JavaFX線程上執行,而不是在事件調度線程上執行。關於如何解決這個問題見my answer