我读过这篇文章:JavaFx 2.x - Swing:不在 FX 应用程序线程上 https://stackoverflow.com/questions/12182592/javafx-2-x-swing-not-on-fx-application-thread/12202749#12202749
参考“
线程“AWT-EventQueue-0”java.lang.IllegalStateException 中出现异常:工具包未初始化”
我在这里找到了一个讨论JavaFX 2.1:工具包未初始化 https://stackoverflow.com/questions/11273773/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。
有什么帮助吗?提前致谢。
因为它保持未定义的时间等待。
这种等待可能是由于latch
。如果您发布的代码在事件调度线程上触发,则latch.await()
呼叫将阻止 EDT 并确保Runnable
您在 EDT 上发布的内容永远不会执行,因此latch.countDown()
声明从未达成。您可以使用以下方法快速检查这一点EventQueue.isDispatchThread
.
我强烈建议简单地删除CountDownLatch
,就像在另一个上运行该代码一样Thread
不是一个选项,因为您正在使用 Swing 组件,应该在事件调度线程上访问/修改/创建/...。
此外,一旦您删除了闩锁,您将遇到与链接问题 https://stackoverflow.com/q/12182592/1076463. The
javafxPanel.setScene( new Scene(pane) {
Text text = new Text("Hello World");
});
必须在 JavaFX 线程上执行,而不是在事件调度线程上执行。看我的答案 https://stackoverflow.com/a/12184250/1076463关于如何解决这个问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)