javafx在swing异常“Toolkit not initialized”中

时间:2012-08-31 06:52:01

标签: java swing javafx-2

我看过帖子: JavaFx 2.x - Swing : Not on FX application thread

参考“ 线程“AWT-EventQueue-0”中的异常java.lang.IllegalStateException:Toolkit未初始化“

我在这里找到了一个讨论JavaFX 2.1: Toolkit not initialized

但我无法使用解决方案

“在Swing Event Dispatcher Thread中设置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。

有任何帮助吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

  

因为等待时间不确定。

此等待可能由latch引起。如果您发布的代码是在事件发送线程上触发的,latch.await()调用将阻止EDT,并确保您在EDT上发布的Runnable永远不会执行,因此latch.countDown()永远不会达成声明。您可以使用EventQueue.isDispatchThread方法快速检查这一点。

我强烈建议您只删除CountDownLatch,因为您正在使用Swing组件(应该访问/修改/创建/),因此在另一个Thread上运行该代码不是一个选项。 ..在事件派遣线程上。

此外,一旦取下闩锁,您将遇到与linked question中相同的异常。

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

必须在JavaFX线程上执行,而不是在Event Dispatch Thread上执行。有关如何解决此问题,请参阅my answer