JavaFX in Swing Exception "Toolkit not initialized"



我已经阅读了这篇文章:JavaFx 2.x-Swing:不在FX应用程序线程上

关于"线程"AWT-EventQueue-0"java.lang.IollegalStateException中出现异常:Toolkit未初始化"

我在这里找到了一个讨论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。

有什么帮助吗?提前谢谢。

因为它停留在未定义的时间等待。

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

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

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

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

必须在JavaFX线程上执行,而不是在事件调度线程上执行。看看我对如何解决这个问题的回答。

最新更新