首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用java 11冻结JFXPanel setScene

用java 11冻结JFXPanel setScene
EN

Stack Overflow用户
提问于 2018-11-16 18:03:52
回答 1查看 1.1K关注 0票数 3

我想将openjfx集成到我的Java 11代码中。在Windows10上使用IntelliJ IDEA 2018.2.6,我创建了一个测试项目,并尝试了以下代码

代码语言:javascript
复制
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的任何问题

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-16 18:18:31

在主线程上设置Scene。来自JFXPanel的文档(emphasis mine):

有一些与JFXPanel相关的限制。作为Swing组件,它只能从事件分派线程访问,但方法除外,该方法可以在事件调度线程上或在JavaFX应用程序线程上调用。

setScene封装在Platform.runLater调用(或SwingUtilities.invokeLater)中。

代码语言:javascript
复制
Platform.runLater(() -> {
    dummyPanel.setScene(dummyScene);
    System.out.println("Scene Created");
});

注意,使用当前代码,一旦main返回,JVM将继续运行。创建一个JFXPanel将初始化JavaFX运行时,直到关闭最后一个窗口(仅当Platform.isImplicitExittrue)或调用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();});}

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53343167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档