如何将阶段大小调整与组件大小调整绑定



我有一个带有FXML的JavaFX 2.0应用程序。我希望在调整包含应用程序的窗口大小时调整组件(文本字段、组合框、布局等)的大小。所以。。。

  • 正如在 Java FX 的 Oracle 文档中所写的那样,要用形状制作这样的东西,形状有一些特殊的属性:

使用 JavaFX 构建 GUI 应用程序时,您会注意到 API 中的某些类已经实现了属性。例如,javafx.scene.shape.Rectangle类包含 arcHeightarcWidthheightwidthxy 的属性。对于这些属性中的每一个,都将有与前面描述的约定匹配的相应方法。例如,getArcHeight()setArcHeight(double)arcHeightProperty() ,它们共同指示(对开发人员和工具而言)给定属性存在。

  • 要将侦听器添加到阶段,我必须执行以下操作:

       stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
            throw new UnsupportedOperationException("Not supported yet.");
        }
    });
    

所以有两个问题:

  • 要进行一些绑定,我必须在控制器类中获得我的阶段。那么 - 如何在控制器类中获得阶段?
  • 看起来 UI 控件没有任何宽度\高度属性,可以绑定到某些内容。或者也许我没有找到它们。

那么,我该如何解决我的问题呢?

UPD 。关于 Scene Builder 致 Sergey Grinev:当我在我的组件上使用 Ctrl+K 时(告诉它占据其父组件的整个区域) - 一切都很好。

但是,如果我想告诉我的组件占据 50% 的面积怎么办?为了检查,我有一个带有两个 VBox 的选项卡。选项卡的宽度为 100px。Vbox的宽度为每个50px。VBox1 有 x1=0,x2=50,VBox2 有 x1=50,x2=100然后我使用 JavaFX 应用程序调整窗口大小。现在我有选项卡的宽度 = 200px。但是我的 VBoxes 宽度仍然 = 50px:VBox1 有 x1=0,x2=50,VBox2 有 x1=150,x2=200我需要它们是 VBox1 x1=0 和 x2=100 和 VBox2 x1=100 和x2=200其中 x1 和 x2 值是 VBoxes 拐角的坐标。

在这种情况下,场景生成器如何帮助我?

构建可调整大小的 guis 的一些建议 =>

  • 确保应用的根目录是 Pane 子类,而不是组。
  • 松开按钮的最大大小(例如 button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE)。
  • 大多数情况下,布局窗格可以为您处理大小调整,并且您不需要绑定和侦听器 =>即仅在您真正需要时才绑定。
  • UI 控件和布局窗格是区域 =>所有区域都具有只读的高度和宽度属性,您可以侦听并绑定到。
  • 不能将控件的高度和宽度属性直接绑定到另一个值。请改用最小宽度/高度、首选项宽度/高度、最大宽度/高度属性。
  • 场景具有高度和宽度属性,如果需要,可以绑定到这些属性。 如果执行此操作,则在调整舞台大小时,将调整场景大小,然后调整绑定组件的大小。 如果场景的根目录是布局窗格而不是组,则通常不需要此绑定。
  • 如果未在场景上设置高度和宽度,对于独立应用,场景(和舞台)的大小将适合场景根节点的首选大小(通常是你想要的大小)。
  • 如果所有其他方法都失败了,您可以开始覆盖 Parent 的布局子项方法。

下面是一个可调整大小的 JavaFX UI 的示例,它实现了上述一些原则。

另一个简单的选择是使用JavaFX Scene Builder(最近作为公开测试版提供:http://www.oracle.com/technetwork/java/javafx/tools/index.html)

它允许通过将UI元素拖放和锚定到边框(通过锚点工具)来创建UI,因此它们会随着窗口边框移动/调整大小。

更新:

要实现自动调整大小百分比布局,您可以将GridPaneColumnConstraint一起使用:

public void start(Stage stage) {
    VBox box1 = new VBox(1);
    VBox box2 = new VBox(1);
    //random content
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20);
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build());
    builder.fill(Color.RED);
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build());
    //half by half screen
    GridPane grid = new GridPane();
    grid.addRow(0, box1, box2);
    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build();
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint);
    stage.setScene(new Scene(grid, 300, 250));
    stage.show();
}

建议:

  1. 如果只有一个主阶段,则在应用启动并在所有控制器类中访问它时将其存储在静态字段/变量中。
  2. 您可以将所有控件/组件放入自动管理其子布局的布局/窗格中。对于不同的布局,请查看 api 文档。之后,将舞台场景的宽度和高度属性相应地绑定到此布局的属性。有关绑定的更多信息,请参阅使用 JavaFX 属性和绑定。
    单向绑定示例

最新更新