我想将openjfx集成到我的Java 11代码中。在Windows10上使用IntelliJ IDEA 2018.2.6,我创建了一个测试项目,并尝试了以下代码
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.TabPane;
public class Java11FXTestApplication {
public static void main(String[] args) {
JFXPanel dummyPanel;
TabPane dummyTabPane;
Scene dummyScene;
System.out.println("Creating JFX Panel");
dummyPanel = new JFXPanel();
System.out.println("Creating TabPane");
dummyTabPane = new TabPane();
System.out.println("Creating Scene");
dummyScene = new Scene(dummyTabPane);
System.out.println("Setting Scene");
dummyPanel.setScene(dummyScene); //Freezing here
System.out.println("Scene Created");
}
}此代码在setScene()方法调用中处于冻结状态。我试着调试它,发现代码在secondaryLoop.enter()调用中无限期地等待在JFXPanel.setScene方法中。知道为什么吗?
这段代码在JDK-8中运行良好,但不适用于java-11.0.1。
我在这个问题上一事无成,有点拘泥于Java11 JavaFX问题。密码有问题吗?或报告的javafx for java11的任何问题
发布于 2018-11-16 18:18:31
在主线程上设置Scene。来自JFXPanel的文档(emphasis mine):
有一些与
JFXPanel相关的限制。作为Swing组件,它只能从事件分派线程访问,但方法除外,该方法可以在事件调度线程上或在JavaFX应用程序线程上调用。
将setScene封装在Platform.runLater调用(或SwingUtilities.invokeLater)中。
Platform.runLater(() -> {
dummyPanel.setScene(dummyScene);
System.out.println("Scene Created");
});注意,使用当前代码,一旦main返回,JVM将继续运行。创建一个JFXPanel将初始化JavaFX运行时,直到关闭最后一个窗口(仅当Platform.isImplicitExit为true)或调用Platform.exit时才会退出。因为您的代码两者都没有,所以JavaFX运行时将继续运行。
JFXPanel的文档还提供了一个如何使用它的示例(注意,几乎所有事情都发生在事件调度线程或JavaFX应用程序线程上):
下面是
JFXPanel可以使用的一种典型模式: 在Swing线程initAndShowGUI框架=新JFrame("FX");最终JFXPanel fxPanel =新JFXPanel();frame.add(fxPanel);frame.setVisible(真);Platform.runLater(新的Runnable() { @Override (){ initFX( fxPanel);} });}在JavaFX线程场景= createScene();fxPanel.setScene(场景)上调用私有静态空洞initFX(JFXPanel FxPanel){ //此方法;}公共静态void (String[] args) {SwingUtilities.invokeLater(新的Runnable() { @Override (){ initAndShowGUI();});}
https://stackoverflow.com/questions/53343167
复制相似问题