如何在 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 文件相对路径。