有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java有两种加载FXML的方法;为什么一个比另一个更受欢迎?

我正在寻找关于为什么我们应该在加载和显示新的FXML阶段时使用一种方法而不是另一种方法的反馈

大多数时候,我都会看到教程之类的内容,显示从单独的类加载一个阶段。然而,它也可以在FXML文件的控制器本身内完成,我个人认为这种方式更干净、更易于管理

考虑以下<强>主。java类:

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {

        // Method 1:
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Layout.fxml"));
            loader.setController(new LayoutController());

            stage.setScene(new Scene(loader.load()));
            stage.show();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

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

这似乎是流行的方法。它创建控件并设置Scene,然后显示它

但是,如果我们将start()方法改为:

@Override
public void start(Stage stage) throws Exception {

    LayoutController controller = new LayoutController();
    controller.showStage();

}

并将FXML加载代码移动到LayoutController构造函数中,结果相同:

public class LayoutController {

    @FXML
    private Label label;

    private Stage stage = new Stage();

    public LayoutController() {

        // Method 2:
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Layout.fxml"));
            loader.setController(this);

            stage.setScene(new Scene(loader.load()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void showStage() {
        this.stage.showAndWait();
    }
}

我在这里看到的好处是视图和逻辑之间的更多分离。关于LayoutController及其关联的FXML文件的所有内容都包含在一个地方

所以我的问题是:第二种方法有什么问题?我认为这不是标准方法是有原因的,但我看不出有任何缺点

Would a question like this be more suited to Code Review? I'm not really asking for opinions, as there seems to be a general "rule" that the first method be used.


共 (1) 个答案

  1. # 1 楼答案

    在这种情况下,差别不大

    对于较大的项目,第二种方法是不可取的:

    它违反了single responsibility principle

    该班负责:

    • 创造场景
    • 创造舞台
    • 显示阶段(更糟糕的是,它的显示方式可能会干扰其他逻辑(showAndWait))
    • 它是视图的控制器,可能负责处理多个事件

    此外,该类的设计方式可以防止职责毫无问题地转移到其他类

    在一个更大的程序中,你可能想创建一个类来管理向视图传递数据、排列窗口或将视图显示为场景的一部分等。第二种方法不适合这种情况

    此外,这会让你很难不重复自己的话。除非将逻辑移动到公共超类型,否则还需要实现在每个控制器类中显示场景的逻辑。重复相同或相似的代码会导致代码难以维护


    注意:使用单个类加载fxml并用作控制器并不一定是坏事,但您应该使用Introduction to FXML.中介绍的自定义组件方法