转载自  JavaFX 2.1:Toolkit not initialized

一、问题

我的应用程序是基于Swing的。我想介绍JavaFX并将其配置为在辅助显示器上渲染场景。我可以使用JFrame来保存一个可以容纳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 {@Overridepublic void start(Stage stage) throws Exception {// JavaFX should be initializedsomeGlobalVar.setInitialized(true);}
}

旁注:因为Application.launch()方法接受一个Class参数,所以必须使用全局变量来表示已初始化JavaFX环境。

替代方法:在Swing Event Dispatcher Thread中实例化JFXPanel

final CountDownLatch latch = new CountDownLatch(1);
SwingUtilities.invokeLater(new Runnable() {public void run() {new JFXPanel(); // initializes JavaFX environmentlatch.countDown();}
});
latch.await();

通过使用此方法,调用线程将等待直到设置JavaFX环境。

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

(1)回答1

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

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

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

(2)回答2

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

public class BootJavaFX {public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {@Overridepublic void run() {new JFXPanel(); // this will prepare JavaFX toolkit and environmentPlatform.runLater(new Runnable() {@Overridepublic 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() {@Overridepublic void handle(WindowEvent windowEvent) {System.exit(0);}}).build().show();}});}});}
}

(3)回答三

我在创建用于测试javaFX tableview更新的unittests时使用了以下命令

public class testingTableView {@BeforeClasspublic static void initToolkit() throws InterruptedException{final CountDownLatch latch = new CountDownLatch(1);SwingUtilities.invokeLater(() -> {new JFXPanel(); // initializes JavaFX environmentlatch.countDown();});if (!latch.await(5L, TimeUnit.SECONDS))throw new ExceptionInInitializerError();}@Testpublic void updateTableView() throws Exception {TableView yourTable = new TableView<>();.... do your testing stuff}}

尽管这篇文章与测试无关,但它帮助我让我的单元测试工作

  • 没有BeforeClass initToolkit,那么在unittest中实例化TableView会产生一个缺少工具包的消息

(4)回答4

还可以通过调用以下方式显式初始化工具包: com.sun.javafx.application.PlatformImpl#startup(Runnable)

有点hacky,由于使用* Impl,但是如果你不想使用ApplicationJXFPanel出于某种原因很有用。

从这篇文章重新发布自己

(5)回答五

我检查了源代码,这是初始化它

com.sun.javafx.application.PlatformImpl.startup(()->{});

并退出它

com.sun.javafx.application.PlatformImpl.exit();

JavaFX 2.1:Toolkit not initialized相关推荐

  1. Hello JavaFX 2.0:命令行介绍

    我从博客文章Hello JavaFX 2.0:NetBeans 7.1 beta的介绍中,从NetBeans 7.1 beta的角度看了一个无处不在的Hello World示例的简单JavaFX版本. ...

  2. 书评:JavaFX 2.0:示例介绍

    尽管Oracle在JavaOne 2010和JavaOne 2011上对JavaFX的更改使我从怀疑论者转变为对JavaFX的信奉者 ,但是JavaFX愿景的转变并非没有缺点 . 特别是,JavaFX ...

  3. JavaFX七巧板游戏:布局控件

    用于布局的控件 JavaFX七巧板游戏:布局入门到放弃一文把用于布局的窗格(Pane)拉了一遍,里面提到有一些控件,也有布局的作用. 明显,控件与窗格一样,是Region的子类:与窗格不同的是,控件有 ...

  4. 【解决error】:AttributeError: partially initialized module ‘re‘ has no attribute ‘IGNORECASE‘

    困扰了我好久的问题,居然这么轻松就能解决!!!! 代码如下: from bs4 import BeautifulSoup import re import urllib.request import ...

  5. 百篇大计敬本年之C++坎坷之路 —— Warning:will be initialized after [-Wreorder]

    为什么80%的码农都做不了架构师?>>>    今天编写 C++ 程序时发现一个 Warning,百思不得其解后,在网上找到了这个答案,嗯哼,就是顺序出问题了 class A { p ...

  6. WP8开发日志(1):Toolkit的本地化

    其实此篇blog本不是这时候发表的,但由于爱恨纠缠,还是将此备忘先写下来罢,免得到时又忘记--只要自己还在弄WP的东西估计不会那么快就是啦.WP8的开发,其实跟WinRT的开发大同小异而已,满眼都是C ...

  7. JavaFX技巧32:需要图标吗? 使用Ikonli!

    动机 自2013年以来,我一直在编写JavaFX应用程序和库的代码,它们的共同点是,我需要找到可以用于它们的良好图标/图形. 作为前Swing开发人员,我首先使用图像文件,GIF或PNG. 通常,我会 ...

  8. JavaFX技巧30:带有DropShadow的ScrollPane

    最近,在我的一个项目中,我发现用户很难看到ScrollPane实例的内容当前是否已滚动. 一种更清晰的方法是在滚动窗格的顶部添加阴影. 这也是Google的Material Design建议的. 所以 ...

  9. JavaFX技巧29:使布局忽略不可见的节点

    在我仍在Swing中实现UI的时候,我曾经是MigLayout的忠实拥护者("一个布局管理者来统治所有这些,对吗Mikael?"). 我真正喜欢的功能之一是当组件不可见时可以定义不 ...

最新文章

  1. 有哪些适合远程办公的软件值得推荐?
  2. 前台更新进度条js-4
  3. hdu4530 水题
  4. linux 高级命令
  5. 大侠稍等!URL 中为何出现奇怪的字符
  6. 这6部顶级数学纪录片,告诉你数学一点都不无趣!
  7. Flutter底部导航栏BottomNavigationBar页面状态保持解决方案
  8. C# set和get如何用
  9. 95-190-741-源码-WindowFunction-窗口流简介
  10. 从切比雪夫不等式到大数定理
  11. 再谈如何以最简单的方法将泛型为String类型的集合或String类型的数组转化为逗号间隔字符串形式
  12. 亲,愚人节要来了!记得带着智商出门哦
  13. 《C语言入门经典》读后感(一)
  14. 钉钉群机器人关键词自动回复_自动化运维平台Spug测试
  15. 计算机英语格式怎么写,26个英文字母,正确的书写格式,孩子真的会吗?
  16. POJ 1088 滑雪(输出对比)
  17. 计算机毕业设计ssm儿童成长记录与分享系统cc35g系统+程序+源码+lw+远程部署
  18. 华硕(ASUS)魔霸系列出厂系统Iwin10/11原厂OEM系统
  19. 计算机网络技术中,计算机网络技术
  20. 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息

热门文章

  1. 单片机C语言中空语句,单片机C语言中的空语句.doc
  2. go语言io reader_go语言之IO操作(待补充)
  3. 2021—ICPC省赛冲刺
  4. linux卸载docker redis,【Docker】Redis在docker上的安装、启动、停止、删除操作
  5. java开发中准则怎么写_Java开发中通用的方法和准则20条
  6. math:线性代数之行列式
  7. mysql 1030 error:Got error 28 from storage engine
  8. CF535C Tavas and Karafs 二分 + 结论
  9. Codeforces Round #305 (Div. 1) D. Mike and Fish 欧拉回路
  10. 牛客 CCA的区间 dp + 补集转移