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

时间:2018-01-07 10:13:06

标签: 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);

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

3 个答案:

答案 0 :(得分:6)

使用正确的工具

使用这两种方法都有好处,如果不分析您尝试制作的场景,一般情况下哪一个更好?

FXML的优点

  • 快速设计
  • WYSYWYG编辑器(SceneBuilder)
  • 可以修改场景而无需重新编译应用
  • 视图和控制器的完美分离
  • 在大多数情况下,fxml结构类似于对象结构,使其易于阅读。

缺点(与java代码相比)

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

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

答案 1 :(得分:2)

当您使用JavaFX + FXML构建项目时,

场景构建器是惊人的,我不能推荐它。

当你使用fxml时,你的类变得更加清晰,你可以专注于进一步扩展容器/控件的功能。你仍然会使用javafx类,你的控制器可能会变得很大。很高兴知道如何构造布局的概念以及何时使用什么样的容器,所以当你刚开始学习基础知识时,在代码中实现你的布局,然后转向使用SceneBuilder和FXML。

在代码中实现更复杂的布局后,您可以将这些技能转换为其他语言/平台。

在某些情况下,您无法通过SceneBuilder执行您想要的操作,例如在运行时创建的一些动态布局,并且包含在单独的自定义组件/ fxml文件中会非常棘手和混乱。然后在代码中将其写下来,并在其上面加上复杂的逻辑。

答案 2 :(得分:1)

直接使用SceneBuilder / FXML实现它。 JavaFX旨在使用XML UI定义文件,而不是在Java代码中编写UI。这是一种像Android一样的分离。