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 楼答案
在这种情况下,差别不大
对于较大的项目,第二种方法是不可取的:
它违反了single responsibility principle:
该班负责:
showAndWait
))此外,该类的设计方式可以防止职责毫无问题地转移到其他类
在一个更大的程序中,你可能想创建一个类来管理向视图传递数据、排列窗口或将视图显示为场景的一部分等。第二种方法不适合这种情况
此外,这会让你很难不重复自己的话。除非将逻辑移动到公共超类型,否则还需要实现在每个控制器类中显示场景的逻辑。重复相同或相似的代码会导致代码难以维护
注意:使用单个类加载fxml并用作控制器并不一定是坏事,但您应该使用Introduction to FXML.中介绍的自定义组件方法