为了账号安全,请及时绑定邮箱和手机立即绑定

JavaFX 2.1:工具包未初始化

JavaFX 2.1:工具包未初始化

慕尼黑8549860 2019-10-19 16:31:19
我的应用程序是基于Swing的。我想介绍JavaFX并将其配置为在辅助显示器上渲染场景。我可以使用JFrame来容纳JFXPanel,而JFXPanel可以容纳JFXPanel,但是我想使用JavaFX API来实现。不能将com.sun.glass.ui.Application子类化并使用Application.launch(this),因为调用线程将被阻止。当从Swing EDT实例化Stage时,我得到的错误是:java.lang.IllegalStateException: Toolkit not initialized有指针吗?编辑:结论问题:不重要的Swing GUI应用程序需要运行JavaFX组件。应用程序的启动过程会在启动相关服务层后初始化GUI。解决方案子类化JavaFX Application类,并在单独的线程中运行它,例如:public class JavaFXInitializer extends Application {    @Override    public void start(Stage stage) throws Exception {        // JavaFX should be initialized        someGlobalVar.setInitialized(true);    }}旁注:由于Application.launch()方法采用a Class<? extends Application>作为参数,因此必须使用全局变量来表示JavaFX环境已初始化。替代方法:在Swing Event Dispatcher线程中实例化JFXPanel:final CountDownLatch latch = new CountDownLatch(1);SwingUtilities.invokeLater(new Runnable() {    public void run() {        new JFXPanel(); // initializes JavaFX environment        latch.countDown();    }});latch.await();通过使用这种方法,调用线程将等待,直到建立JavaFX环境为止。选择您认为合适的任何解决方案。我选择了第二个参数,因为它不需要全局变量来表示JavaFX环境的初始化,并且也不会浪费线程。
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

使用JavaFX的唯一方法是将Application子类化或使用JFXPanel,正是因为它们准备了env和toolkit。


阻塞线程可以使用来解决new Thread(...)。


尽管如果您在与Swing / AWT相同的VM中使用JavaFX,我建议使用JFXPanel,但是您可以在此处找到更多详细信息:将AWT与JavaFx一起使用是否可以?


查看完整回答
反对 回复 2019-10-19
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

创建用于测试javaFX tableview更新的单元测试时,我使用了以下命令


public class testingTableView {

        @BeforeClass

        public static void initToolkit() throws InterruptedException

        {

            final CountDownLatch latch = new CountDownLatch(1);

            SwingUtilities.invokeLater(() -> {

                new JFXPanel(); // initializes JavaFX environment

                latch.countDown();

            });


            if (!latch.await(5L, TimeUnit.SECONDS))

                throw new ExceptionInInitializerError();

        }


        @Test

        public void updateTableView() throws Exception {


            TableView<yourclassDefiningEntries> yourTable = new TableView<>();

            .... do your testing stuff


        }

    }

即使这篇文章与测试无关,也可以帮助我进行单元测试


如果没有BeforeClass initToolkit,则在单元测试中实例化TableView将产生一条消息,提示缺少工具包


查看完整回答
反对 回复 2019-10-19
  • 3 回答
  • 0 关注
  • 1068 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信