2

我读过这篇文章: JavaFx 2.x - Swing : Not on FX application thread

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

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

但我无法使用该解决方案

“在 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 并确保Runnable您在 EDT 上发布的代码永远不会执行,因此latch.countDown()永远不会到达该语句。您可以使用该方法快速检查这一点EventQueue.isDispatchThread

我强烈建议简单地删除CountDownLatch, 因为在另一个上运行该代码Thread不是一种选择,因为您正在使用 Swing 组件,应该在事件调度线程上访问/修改/创建/...。

此外,一旦您移除了闩锁,您将遇到与链接问题中相同的异常。这

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

必须在 JavaFX 线程上执行,而不是在 Event Dispatch 线程上执行。请参阅关于如何解决该问题的答案。

于 2012-08-31T07:35:13.350 回答