我应该使用SceneBuilder还是在代码中实现布局?

Big*_*ick 4 java javafx

我对JavaFX和Java很新,但我经历了一些奇怪的事情.起初,我参加了Java课程,然后我们使用SceneBuilder为应用程序创建布局.我已经完成了课程,我正在尝试自己编写一些简单的应用程序.但每当我在互联网上寻找解决问题的方法时,无处不在的布局都是在代码中实现的,这意味着:使用类似这样的东西:

Label secondLabel = new Label("I'm a Label on new Window");
StackPane secondaryLayout = new StackPane();
secondaryLayout.getChildren().add(secondLabel);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:我应该如何创建布局?我应该坚持使用SceneBuilder还是用Java编写代码,因为显然每个人都这样做?

fab*_*ian 6

使用正确的工具来完成正确的工作

使用这两种方法都有好处,如果不分析您尝试创建的场景,通常无法判断哪一种更好

FXML的优点

  • 快速设计
  • WYSYWYG编辑器(SceneBuilder)
  • 无需重新编译应用程序即可修改场景
  • 很好的分离视图和控制器与注射
  • 在大多数情况下,fxml结构类似于对象结构,使其易于阅读.

缺点(与java代码相比)

  • 加载fxml比java代码慢
  • 没有循环可能.当你需要在场景中插入10次时,你需要至少10个标签; 你必须插入100次?这至少有100个标签.单个标签甚至可能不够,例如,对于GridPane每个<fx:include>标签无法将多个节点插入多个列.
  • 将节点存储到集合中需要fx:id为所有元素分配不同的s,然后在不同的位置列出所有元素.
  • 没有编译时检查.您想要添加Integer到父级的子列表?您可以编写一个fxml来执行此操作而不会出现错误 - 直到您尝试加载它为止.java编译器会立即抱怨类似的东西.
  • 没有办法从fxml调用某些方法.
  • 加载fxmls依赖于反射

您当然可以在控制器类中使用java代码,它允许您将fxml + Java代码组合到某个级别.例如,可以在该initialize()方法中创建重复结构.