如何在 Eclipse 中使用 JavaFX 从另一个项目加载 FXML 文件?
How do I load an FXML file from another project using JavaFX in eclipse?
我有两个项目:"Game" 和 "Game Library" - 游戏有一个到游戏库项目的构建路径。在游戏库中,我有一个方法可以在游戏请求时切换场景。
Game Library项目中的场景切换方法:
package gamelibrary;
public class SceneSwitcher{
public Stage window;
public Parent root;
public void switchSceneFXML(String FXMLLocation) throws Exception{
try{
window = (Stage) node.getScene().getWindow();
}catch(Exception e){
e.printStackTrace();
}
root = FXMLLoader.load(getClass().getResource(FXMLLocation));
window.setScene(new Scene(root));
window.show();
}
}
我在Game项目中调用了这个方法:
package game;
import gamelibrary.sceneSwitcher;
public class firstWindowController{
public void buttonHandler(ActionEvent event){
SceneSwitcher scene = new SceneSwitcher();
if(event.getSource().equals(playButton){
scene.switchScene("/game/SecondWindow.fxml");
}
}
}
所以当我点击 FirstWindow.fxml 中的 playButton 时,Game 项目中的 FirstWindowController 将调用 Game Library 项目中的 switchSceneFXML 方法。
我收到这个错误:
java.lang.NullPointerException: Location is required.
在
root = FXMLLoader.load(getClass().getResource(FXMLLocation));
在
scene.switchSceneFXML("/game/SecondWindow.fxml");
有什么我想念的吗?如何让 switchSceneFXML 方法知道在游戏项目而不是游戏库项目中查找包和文件?
我正在尝试使 switchSceneFXML 方法可与其他 FXML 文件重复使用,这样我就不必大量复制和粘贴代码,并且更喜欢一种允许我编写一次并重复使用的方法。
我环顾四周寻找答案,但我无法在其他人的情况下完全理解这个概念。感谢您的帮助!
I am trying to make the switchSceneFXML method reusable for more than just on FXML. Is there a way I can get the name of the class automatically? – Chris
那么您应该让各种 类 自己加载它们的 FXML。您可以使用 JVM ServiceLoader
来完成此操作
在 gane 库中:
interface FxmlController{
boolean isPrividingScene(String nextSceneIdOrName);
String getFXMLLocation();
}
public class SceneSwitcher{
public Stage window;
public Parent root;
private static ServiceLoader<FxmlController> sceneControllers
= ServiceLoader.load(FxmlController.class);
public void switchSceneFXML(String nextSceneIdOrName) throws Exception{
try{
window = (Stage) node.getScene().getWindow();
for(FxmlController controller : sceneControllers){
if(controller.isPrividingScene(nextSceneIdOrName)){ // however you want to select the next scene...
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setController(controller);
root = fxmlLoader.load(controller.getClass().getResource(controller.getFXMLLocation()));
window.setScene(new Scene(root));
window.show();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
这样每个 FxmlController 都可以(但不需要)存在于自己的 jar 文件中,该文件具有自己的 FXML 文件相对路径。
我有两个项目:"Game" 和 "Game Library" - 游戏有一个到游戏库项目的构建路径。在游戏库中,我有一个方法可以在游戏请求时切换场景。
Game Library项目中的场景切换方法:
package gamelibrary;
public class SceneSwitcher{
public Stage window;
public Parent root;
public void switchSceneFXML(String FXMLLocation) throws Exception{
try{
window = (Stage) node.getScene().getWindow();
}catch(Exception e){
e.printStackTrace();
}
root = FXMLLoader.load(getClass().getResource(FXMLLocation));
window.setScene(new Scene(root));
window.show();
}
}
我在Game项目中调用了这个方法:
package game;
import gamelibrary.sceneSwitcher;
public class firstWindowController{
public void buttonHandler(ActionEvent event){
SceneSwitcher scene = new SceneSwitcher();
if(event.getSource().equals(playButton){
scene.switchScene("/game/SecondWindow.fxml");
}
}
}
所以当我点击 FirstWindow.fxml 中的 playButton 时,Game 项目中的 FirstWindowController 将调用 Game Library 项目中的 switchSceneFXML 方法。
我收到这个错误:
java.lang.NullPointerException: Location is required.
在
root = FXMLLoader.load(getClass().getResource(FXMLLocation));
在
scene.switchSceneFXML("/game/SecondWindow.fxml");
有什么我想念的吗?如何让 switchSceneFXML 方法知道在游戏项目而不是游戏库项目中查找包和文件?
我正在尝试使 switchSceneFXML 方法可与其他 FXML 文件重复使用,这样我就不必大量复制和粘贴代码,并且更喜欢一种允许我编写一次并重复使用的方法。
我环顾四周寻找答案,但我无法在其他人的情况下完全理解这个概念。感谢您的帮助!
I am trying to make the switchSceneFXML method reusable for more than just on FXML. Is there a way I can get the name of the class automatically? – Chris
那么您应该让各种 类 自己加载它们的 FXML。您可以使用 JVM ServiceLoader
来完成此操作在 gane 库中:
interface FxmlController{
boolean isPrividingScene(String nextSceneIdOrName);
String getFXMLLocation();
}
public class SceneSwitcher{
public Stage window;
public Parent root;
private static ServiceLoader<FxmlController> sceneControllers
= ServiceLoader.load(FxmlController.class);
public void switchSceneFXML(String nextSceneIdOrName) throws Exception{
try{
window = (Stage) node.getScene().getWindow();
for(FxmlController controller : sceneControllers){
if(controller.isPrividingScene(nextSceneIdOrName)){ // however you want to select the next scene...
FXMLLoader fxmlLoader = new FXMLLoader();
fxmlLoader.setController(controller);
root = fxmlLoader.load(controller.getClass().getResource(controller.getFXMLLocation()));
window.setScene(new Scene(root));
window.show();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
这样每个 FxmlController 都可以(但不需要)存在于自己的 jar 文件中,该文件具有自己的 FXML 文件相对路径。