两种加载FXML的方式;为什么一个偏爱另一个?

时间:2018-07-31 16:56:49

标签: java javafx fxml

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

大多数时候,我会看到一些教程,这些教程显示了如何从单独的类完成舞台的加载。但是,它也可以在FXML文件的控制器本身中完成,我个人认为这种方式更简洁,更易于管理。

考虑以下 Main.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);
    }
}

这似乎是流行的方法。它创建contoller并设置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文件的所有内容都集中在一个地方。

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

  

这样的问题更适合代码审查吗?我并不是真的要征求意见,因为使用第一种方法似乎有一个普遍的“规则”。

1 个答案:

答案 0 :(得分:5)

在这种情况下,差别不大。

对于大型程序,第二种方法是不受欢迎的:

它违反了single responsibility principle

该班负责:

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

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

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

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


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