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