【问题标题】:javafx in swing exception "Toolkit not initialized"摆动异常中的 javafx “工具包未初始化”
【发布时间】:2012-08-25 23:17:37
【问题描述】:

我读过这篇文章: 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。

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

【问题讨论】:

    标签: java swing javafx-2


    【解决方案1】:

    因为它保持未定义的等待时间。

    这种等待可能是由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 线程上执行,而不是在 Event Dispatch 线程上。请参阅 my answer 关于如何解决该问题的问题。

    【讨论】:

      猜你喜欢
      • 2012-07-01
      • 2016-10-27
      • 1970-01-01
      • 2016-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多