如何将控制器 (MVC) 添加到我在 Java 中编写的 JavaFX 应用程序?

How do I add a controller (MVC) to my JavaFX application which I wrote in Java?

所以我创建了一个包含以下 classes 的应用程序:Main.java(启动与 window、场景、按钮等一起),Students.java (学生),Connection.java(JDBC 连接到 MySQL 数据库)。还有一个 class 用于登录(有自己的 window、场景、按钮),一个 class 用于图表(打开饼图)以及一个确认框和警报框(再次与windows,场景和按钮)...

然后我读到,通过查看不同的教程以及此处以前的答案,使用 MVC 是一个很好的做法。此外,最好的教程是:http://code.makery.ch/library/javafx-8-tutorial/part1/

然而,本教程的问题在于它使用了场景生成器...我希望通过编写代码来创建我的应用程序。使用我现有的代码(我可以 运行 我的 IDE 上的应用程序和按钮等完美运行,也可以从数据库中获取数据...)但是我如何处理连接器?

我要创建一个新的吗?

(注意:我所有的 classes 都在 .src 中)

您可以像使用 FXML 一样创建控制器 class。创建控制器的实例并传递您在创建所有控件的代码中创建的控件的所有引用。

这样做,您无法利用 FXML 绑定的优势,例如 fx:id、fx:controller 和事件绑定。

javafx 控制器用于控制UI 元素。附加控制器的一种方法是在您的 fxml 文件中添加 fx:controller="controllerClassLocation"

另一种方法是在您的代码中添加控制器,但这也涉及 fxml 文件,如下所示。

      String fxmlPath="MainLayout.fxml";                               
      private Scene getScene(String fxmlPath, ControllerClass controller) {
        FXMLLoader loader;
        Parent parent;
        Scene scene;
        try {
            //not FXMLLoader.load(getClass().getResource(fxmlPath)
            loader = new FXMLLoader(getClass().getResource(fxmlPath));
            loader.setController(controller);
            parent = loader.load();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        scene = new Scene(parent);

        return scene;

    }

如果您想绑定 javafx UI 元素,您可以使用控制器。

如果您不想使用 fxml 文件,则必须对所有 UI 元素进行编码,并绑定到它们各自的函数和事件以控制它们。例如:在下面的示例中,创建了一个 按钮 btn 并在单击该按钮时处理一个事件。 Button btn 绑定到函数 setOnAction(new EventHandler()) .

public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World");
        }
    });

    StackPane root = new StackPane();
    root.getChildren().add(btn);

    Scene scene = new Scene(root, 500, 250);

    primaryStage.setTitle("Hello World");
    primaryStage.setScene(scene);
    primaryStage.show();
}