当我在 Maven 项目中运行主类时,我得到:
Exception in Application start method
据我了解,这是因为 FXML 文件无法加载。
这是文件系统层次结构
src
└- main
├- java
| └- zenit
| └- ui
| └- TestUI.java
└- resources
└- zenit
└- ui
└- Main.fxml
在 Eclipse 中(在 src 内)
阅读apache's maven guide和 other statck questions ,以下代码片段似乎是创建 FXMLLoader
并指向 Main.fxml
文件的正确方法。
public class TestUI extends Application {
public void start(Stage stage) throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
.
. // set controller, load parent, set scene etc.
.
}
public static void main(String[] args) {
launch(args);
}
}
但是这段代码会抛出前面提到的异常。
当我试图查明代码中Exception
的来源时,我发现它来自于FXMLLoader
。
因此,我在 FXMLLoader loader = new FXMLLoader(..)
上面的行上运行了不同的系统输出(一次一个):
System.out.println(getClass().getResource("Main.fxml"));
System.out.println(getClass().getResource("main/resources/zenit/ui/Main.fxml"));
System.out.println(getClass().getResource("../../../resources/zenit/ui/Main.fxml"));
对于所有人来说,控制台输出是:(显然不是预期的输出)
null
所以,我的问题是,
为什么.getResource("Main.fxml")
在这里返回null
?
在这种情况下如何正确访问 Main.fxml
文件?
我的系统:
- Maven:Apache Maven 3.6.0
- Java SE:11.0.2
- JavaFX:11.0.2
- Eclipse:2018-12 (4.10.0)
- 操作系统:macOS Mojave - v10.14.3
最佳答案
我认为您的主要问题是“ikonli”库。如果您尝试使用 scenebuilder 打开 fxml,您将看到异常。我的建议是你失去这种依赖。使用更简单的东西,例如 svg 图形:
在 fxml 按钮中 > 添加区域 > 设置区域大小 > 然后在样式部分添加 css 属性 -fx-shape > 并在值中设置引号中的 svg 路径,即:“M827.6 ... 122z"
接下来添加另一个 css 属性 -fx-scale-shape > 并将其值设置为 true
以上不需要任何第三方库,您可以在线免费找到所有图标。
- 我建议您从主 Controller 类加载 fxml。在 fxml 中检查属性 fxroot 并向主 Controller 添加一个构造函数,如下所示
公共(public)MainController(){
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
loader.setController(this);
loader.setRoot(this);
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
您的 Controller 应该像这样扩展根容器:
公共(public)类 MainController 扩展了 VBox {
然后在主类中将主 Controller 传递给场景
Scene scene = new Scene(controller);
我相信您的 Maven 项目设置不正确。您应该右键单击您的项目 > 配置 > 转换为 Maven 项目。如果包装变红,请清理它们。
最后一件事 - 您需要添加另一个名为 Launcher 的类 - 然后从中启动您的应用程序 - 不要从主类中删除 main 方法
包 zenit.ui;
公共(public)类启动器{
public static void main(String[] args) {
TestUI.main(args);
}
}
希望这有帮助!
关于java - FXMLLoader 找不到 fxml 文件 - Maven 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55630040/