JavaFX - 在没有 FXLoader 的情况下加载 FXML 文件

JavaFX - load FXML-file without FXLoader

我正在试验 "new" JavaFX,它运行良好。

现在我正处于一个我无法理解的地步。我的视图有一个控制器,我想从主方法加载我的控制器,以便控制器可以加载视图或做任何它喜欢的事情。

我的问题是,我必须使用 FXMLLoader.load() 方法加载我的 FXML 文件。 FXMLLoader 自己加载控制器。所以实际上,使用我的方法,我将加载控制器两次:我使用 XController xcontroller = new XController(); 加载控制器,并在该控制器内部我使用 FXMLLoader.load() 加载 te 视图,这将再次加载控制器。

我必须使用 FXMLLoader 还是可以让我的控制器使用其他方法加载视图?

edit 我想使用 Presentation-Abstraction-Control (PAC) 模式(MVC 的变体),这就是为什么我认为让控制器加载视图很重要。

主要class

    public class Main extends Application
    {

        Override
        public void start(Stage primaryStage)
        {
            LoginController loginController = null;
            try
            {
                loginController = new LoginController();
                loginController.loadSceneInto(primaryStage);

                primaryStage.show();
            }
            .......


        public static void main(String[] args)
        {
            launch(args);
        }
    }

控制器

    public class LoginController
    {

        .....
        public void loadSceneInto(Stage stage) throws IOException
        {
            this.stage  = stage;
            Scene scene = null;
            Pane  root  = null;

            try
            {
                root = FXMLLoader.load(
                        getClass().getResource(
                                this.initialView.getPath()
                        )
                );

                scene = new Scene(root, initialWidth, initialHeight);
                this.stage.setTitle(this.stageTitle);
                this.stage.setScene(scene);

                this.centralizeStage();
            }
            .....
        }
    }

如果我没理解错的话,不是

    root = FXMLLoader.load(
            getClass().getResource(
                    this.initialView.getPath()
            )
    );

随便做

FXMLLoader loader = new FXMLLoader(
    getClass().getResource(this.initialView.getPath());
);
loader.setController(this);
root = loader.load();

您需要从 FXML 文件中删除 fx:controller 属性才能使其生效。