当前位置: 首页 > 知识库问答 >
问题:

JavaFX2.1:工具包未初始化

白赞
2023-03-14

我的应用程序是基于Swing的。我想介绍JavaFX,并将其配置为在辅助显示器上呈现场景。我可以使用JFrame来保存JFXPanel,JFXPanel可以保存JFXPanel,但我希望使用JavaFX API来实现这一点。

将com.sun.glass.ui.application子类化并使用application.launch(这)不是一个选项,因为调用线程将被阻塞。

java.lang.IllegalStateException: Toolkit not initialized

编辑:结论

问题:非平凡的Swing GUI应用程序需要运行JavaFX组件。应用程序的启动过程在启动依赖的服务层后初始化GUI。

解决方案

public class JavaFXInitializer extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        // JavaFX should be initialized
        someGlobalVar.setInitialized(true);
    }
}
final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {
    public void run() {
        new JFXPanel(); // initializes JavaFX environment
        latch.countDown();
    }
});
latch.await();

通过使用这种方法,调用线程将等待JavaFX环境的设置。

选择任何你认为合适的解决方案。我选择了第二个,因为它不需要全局变量来指示JavaFX环境的初始化,也不浪费线程。

共有1个答案

况唯
2023-03-14

找到了解决办法。如果我只是在调用JavaFX Platform.RunLater之前从Swing EDT创建一个JFXPanel,它就可以工作。我不知道这个解决方案有多可靠,如果结果不稳定,我可能会选择JFXPanel和JFrame。

public class BootJavaFX {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JFXPanel(); // this will prepare JavaFX toolkit and environment
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        StageBuilder.create()
                                .scene(SceneBuilder.create()
                                        .width(320)
                                        .height(240)
                                        .root(LabelBuilder.create()
                                                .font(Font.font("Arial", 54))
                                                .text("JavaFX")
                                                .build())
                                        .build())
                                .onCloseRequest(new EventHandler<WindowEvent>() {
                                    @Override
                                    public void handle(WindowEvent windowEvent) {
                                        System.exit(0);
                                    }
                                })
                                .build()
                                .show();
                    }
                });
            }
        });
    }
}
 类似资料:
  • 我读过帖子:JavaFx 2. x-Swing:不在FX应用程序线程上 参考“线程“AWT-EventQueue-0”java.lang.IllegalStateException:Toolkit未初始化” 我在这里发现了一个关于JavaFX 2.1:工具箱未初始化的讨论 但我无法使用该解决方案 “Istantiate JFXPanel in Swing Event Dispatcher Thre

  • 问题内容: 我正在尝试使用以下命令在程序的后台播放一个简单的mp3: intro.mp3文件与其他.class文件放在我的包的bin文件夹中。 问题是我的程序终止于: 完整的终止日志为: 根据问题的原因有人有想法吗? 问题答案: 在启动时执行“隐藏”初始化。运行不会触发初始化。 触发它的最简单方法是: 已经执行 具有从fx ant任务打包的jar运行的基础程序(例如,从Netbeans JavaF

  • 我正试着用下面的代码在我的程序背景中制作一个简单的mp3播放器: intro.mp3文件和其他文件一起放在我的包的bin文件夹中。类文件。 问题是我的程序终止于: 完整的终止日志是: 根据问题的原因,有人有任何想法吗?

  • 问题内容: 情况: Go程序包 A 由3个文件组成,每个文件中我都使用另一个程序包 B 中的函数。我必须在每个文件的开头导入包 B。 题: 程序包 B 实际上是初始化3次还是仅初始化1次? 问题答案: 简短答案:初始化仅执行一次。 长答案:引用相关的规范部分- 程序执行: 通过为所有包级变量分配初始值,然后使用名称和签名调用任何包级函数来初始化不导入的包 在其来源中定义。名称为package-sc

  • 以下是我的配置 java版本“1.8.0_101”java(TM)SE运行时环境(构建1.8.0_101-b13)java热点(TM)64位服务器虚拟机(构建25.101-b13,混合模式) 使用Apache http客户端v4.4调用Restful服务,服务URL具有有效的证书(SHA2) 我们使用apache http客户端调用服务。下面是代码 服务调用是间歇性失败的,有一个批处理过程在一个循

  • 我正在尝试运行一个Spring项目。pom.xml: 结果是这样的: 2017-08-17 01:11:01.405信息9156---[restartedMain]org.ocp.TestruleemallApplication:在桌面上启动TestruleemallApplication-PL25CTR,PID 9156(C:\Users\Ilias\DesktoP\TestRuleEmall\