背景:我创建了一个使用JFXPanel嵌入Swing框架中的JavaFX应用程序。我一直在使用Eclipse作为IDE。 “主应用程序”是另一个类,它只用于创建一个扩展JFXPanel
以在实例化时加载我的.fxml文件的类的实例。当从Eclipse执行主类时,一切都很好,我的.fxml文件中指定的fx:控制器调用了其方法initialize()
(我可以通过它在加载时对UI进行的更改进行分析),并且没有任何问题。但是,当我将所有东西打包成一个JAR并尝试将我的JFXPanel扩展类添加到一个Swing JFrame
实例时,它设法加载.fxml文件,只是精细读取图像,样式表等,而其余的该代码正常工作,但fx:controller
的initialize()
方法从未被调用过。我没有问题从jar内部或外部的其他类访问类,我甚至尝试设置一个ControllerFactory,它将返回Controller的一个实例,并尝试各种组合设置FXMLLoader
的类加载器并使用无论是调用load()
的静态和非静态方法。结果总是相同的:从IDE启动时它将起作用,但在从我的打包jar启动时不起作用。我知道这个jar不会丢失任何文件,因为就像我说的那样,从Java代码中找到该类并没有问题,并且捆绑的fxml/css文件似乎加载正常,减去控制器问题。JavaFX 2.2在JAR文件中加载时未调用控制器initialize()
有人曾经遇到过这种情况,或者有什么想法可能会发生什么FXMLLoader
未能设置控制器?这可能是某种错误吗?
你的jar是如何部署的?对于JavaFX 2.2,由于FXML使用反射,FXML目前无法在未签名的webstart或applet中工作。我也相信,由于如何管理OSGI类加载(尽管我从未尝试过),可能需要进行一些调整以使JavaFX 2.2 FXML应用程序可以在OSGI环境中工作。您的Jar应该使用JavaFX部署工具打包,否则它可能找不到正确的运行时。也许其中一件事是你的问题。 – jewelsea 2013-05-01 21:09:34