fx 线程 弹窗
JFXPanel是一个组件,可将JavaFX内容嵌入到(旧版;-))Swing应用程序中。 基本上,这使合并两个对象变得非常容易,但是要掌握一些陷阱:两个UI工具箱都是单线程的(Swing:EDT + JavaFX:FX平台线程)。 当一起使用时,您必须处理这两个线程,例如javafx.embed.swing.SwingFXUtils.runOnFxThread(Runnable runnable)
或javafx.embed.swing.SwingFXUtils.runOnEDT(Runnable rrunnable)
FX平台线程是通过initFx()在JFXPanel的构造函数中隐式启动的:
// Initialize FX runtime when the JFXPanel instance is constructed
private synchronized static void initFx() {// Note that calling PlatformImpl.startup more than once is OKPlatformImpl.startup(new Runnable() {@Override public void run() {// No need to do anything here}});
}
但是(如果我理解正确的话),JFXPanel会从Component重写addNotify(),在该组件中将finishListener添加到FX平台( PlatformImpl.addListener(finishListener)
)。 最后一个JFXPanel“死亡”时,将调用Platform.exit
。
这可能会导致一种奇怪的情况:
当使用JFXPanel时(例如与JDialog一起使用):第一个调用打开带有新JFXPanel的Dialog,一切进展顺利。
但是当关闭此对话框时,退出了FX Platform Thread,并且由于某些原因,似乎第二次打开新对话框的调用不会再次启动FX Platform Thread。 因此,JFXPanel上没有任何React!
解:
对我来说,它可以调用(在main()的某个地方早期) Platform.setImplicitExit(false);
以防止隐式关闭FX线程(然后由System.exit()关闭)。
翻译自: https://www.javacodegeeks.com/2015/01/jfxpanel-and-fx-platform-thread-pitfalls.html
fx 线程 弹窗