JavaFX 2.1:工具包未初始化

我的应用程序是基于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环境的初始化,并且也不会浪费线程。


慕尼黑8549860
浏览 1069回答 3
3回答

偶然的你

使用JavaFX的唯一方法是将Application子类化或使用JFXPanel,正是因为它们准备了env和toolkit。阻塞线程可以使用来解决new Thread(...)。尽管如果您在与Swing / AWT相同的VM中使用JavaFX,我建议使用JFXPanel,但是您可以在此处找到更多详细信息:将AWT与JavaFx一起使用是否可以?

哆啦的时光机

创建用于测试javaFX tableview更新的单元测试时,我使用了以下命令public class testingTableView {&nbsp; &nbsp; &nbsp; &nbsp; @BeforeClass&nbsp; &nbsp; &nbsp; &nbsp; public static void initToolkit() throws InterruptedException&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; final CountDownLatch latch = new CountDownLatch(1);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SwingUtilities.invokeLater(() -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new JFXPanel(); // initializes JavaFX environment&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; latch.countDown();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (!latch.await(5L, TimeUnit.SECONDS))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new ExceptionInInitializerError();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; @Test&nbsp; &nbsp; &nbsp; &nbsp; public void updateTableView() throws Exception {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TableView<yourclassDefiningEntries> yourTable = new TableView<>();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .... do your testing stuff&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }即使这篇文章与测试无关,也可以帮助我进行单元测试如果没有BeforeClass initToolkit,则在单元测试中实例化TableView将产生一条消息,提示缺少工具包
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java