我正在寻找有关为什么为什么在加载和显示新的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文件的所有内容都集中在一个地方。
所以我的问题是:第二种方法有什么问题?由于某种原因,我认为这不是标准方法,但是我看不到任何缺点。
这样的问题更适合代码审查吗?我并不是真的要征求意见,因为使用第一种方法似乎有一个普遍的“规则”。
答案 0 :(得分:5)
在这种情况下,差别不大。
对于大型程序,第二种方法是不受欢迎的:
它违反了single responsibility principle:
该班负责:
showAndWait
)此外,该类的设计方式还可以防止职责无问题地转移到其他类中。
在更大的程序中,您可能想要创建一个类,该类管理将数据传递到视图,排列窗口或将视图显示为场景的一部分,等等。第二种方法不适合这种情况。
此外,如果不重复自己的话,这会变得更加困难。除非将逻辑移到公共超类型,否则还需要实现用于在每个控制器类中显示场景的逻辑。重复相同或相似的代码将导致代码难以维护。
注意:使用单个类加载fxml并用作控制器并不一定是一件坏事,但您应该使用本文档中介绍的 Custom Component 方法。 Introduction to FXML.