我看过帖子: 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。
有任何帮助吗?提前谢谢。
答案 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。