FXMLLoader 找不到 fxml 文件 - Maven 项目
FXMLLoader won't find fxml file - Maven project
当我在 Maven 项目中 运行 main class 时,我得到:
Exception in Application start method
据我了解,这是因为无法加载 FXML 文件。
这是文件系统层次结构
src
└- main
├- java
| └- zenit
| └- ui
| └- TestUI.java
└- resources
└- zenit
└- ui
└- Main.fxml
在 Eclipse 中(在 src 内)
阅读 apache's maven guide and 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")
returnnull
?
在这种情况下如何正确访问 Main.fxml
文件?
我的系统:
- Maven:Apache Maven 3.6.0
- Java SE: 11.0.2
- Java外汇:11.0.2
- 日食:2018-12 (4.10.0)
- OS: macOS Mojave - v10.14.3
我认为您的主要问题是库 "ikonli." 如果您尝试使用 scenebuilder 打开 fxml,您将看到异常。我的建议是您失去这种依赖性。使用更简单的东西,例如 svg 图形:
在 fxml 按钮 > 添加区域 > 设置区域大小 > 然后在样式部分添加 css 属性 -fx-shape > 并在值中在引号中设置 svg 路径,即:"M827.6 ... 122z"
接下来添加另一个css 属性 -fx-scale-shape > 并将其值设置为true
以上不需要任何第三方库,你可以在网上免费找到所有图标。
- 我建议您从主控制器加载您的 fxml class。在 fxml 中检查 属性 fxroot 并像这样
添加一个构造函数到你的主控制器
public MainController() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
loader.setController(this);
loader.setRoot(this);
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
你的控制器应该像这样扩展根容器:
public class MainController 扩展 VBox {
然后在main里class只要把主控制器传给场景就可以了
Scene scene = new Scene(controller);
我认为您的 Maven 项目设置不正确。您应该右键单击您的项目 > 配置 > 转换为 Maven 项目。如果包变红,则清理它们。
最后一件事 - 你需要添加另一个名为 Launcher 的 class - 然后你从它启动你的应用程序 - 不要从你的 main class[ 中删除 main 方法=13=]
包 zenit.ui;
public class 启动器 {
public static void main(String[] args) {
TestUI.main(args);
}
}
希望对您有所帮助!
当我在 Maven 项目中 运行 main class 时,我得到:
Exception in Application start method
据我了解,这是因为无法加载 FXML 文件。
这是文件系统层次结构
src
└- main
├- java
| └- zenit
| └- ui
| └- TestUI.java
└- resources
└- zenit
└- ui
└- Main.fxml
在 Eclipse 中(在 src 内)
阅读 apache's maven guide and 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")
returnnull
?
在这种情况下如何正确访问 Main.fxml
文件?
我的系统:
- Maven:Apache Maven 3.6.0
- Java SE: 11.0.2
- Java外汇:11.0.2
- 日食:2018-12 (4.10.0)
- OS: macOS Mojave - v10.14.3
我认为您的主要问题是库 "ikonli." 如果您尝试使用 scenebuilder 打开 fxml,您将看到异常。我的建议是您失去这种依赖性。使用更简单的东西,例如 svg 图形:
在 fxml 按钮 > 添加区域 > 设置区域大小 > 然后在样式部分添加 css 属性 -fx-shape > 并在值中在引号中设置 svg 路径,即:"M827.6 ... 122z"
接下来添加另一个css 属性 -fx-scale-shape > 并将其值设置为true
以上不需要任何第三方库,你可以在网上免费找到所有图标。
- 我建议您从主控制器加载您的 fxml class。在 fxml 中检查 属性 fxroot 并像这样 添加一个构造函数到你的主控制器
public MainController() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Main.fxml"));
loader.setController(this);
loader.setRoot(this);
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
你的控制器应该像这样扩展根容器:
public class MainController 扩展 VBox {
然后在main里class只要把主控制器传给场景就可以了
Scene scene = new Scene(controller);
我认为您的 Maven 项目设置不正确。您应该右键单击您的项目 > 配置 > 转换为 Maven 项目。如果包变红,则清理它们。
最后一件事 - 你需要添加另一个名为 Launcher 的 class - 然后你从它启动你的应用程序 - 不要从你的 main class[ 中删除 main 方法=13=]
包 zenit.ui;
public class 启动器 {
public static void main(String[] args) {
TestUI.main(args);
}
}
希望对您有所帮助!