我已经阅读了这篇文章: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线程上执行,而不是在事件调度线程上执行。看看我对如何解决这个问题的回答。