18

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

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

使用 JavaFX 构建 GUI 应用程序时,您会注意到 API 中的某些类已经实现了属性。例如,javafx.scene.shape.Rectangle该类包含arcHeightarcWidthheightwidthx和的属性y。对于这些属性中的每一个,都会有与前面描述的约定相匹配的相应方法。例如,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 控件没有任何宽度\高度属性,可以绑定到某些东西。或者也许我还没有找到它们。

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

升级版。关于 Scene Builder 给 Sergey Grinev:当我在我的组件上使用Ctrl+K时(告诉它占据其父组件的整个区域) - 一切正常。

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

在这种情况下,Scene Builder 如何帮助我?

4

3 回答 3

20

关于构建可调整大小的 gui 的一些建议 =>

  • 确保您的应用程序的根是 Pane 子类,而不是 Group。
  • 松开按钮的最大尺寸(例如 button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE))。
  • 大多数时候布局窗格可以为您处理大小调整,您不需要绑定和侦听器 => 即仅在您真正需要时才绑定。
  • UI 控件和布局窗格是 Regions => 所有 Regions 都有只读的 height 和 width 属性,你可以监听和绑定。
  • 您不能直接将控件的高度和宽度属性绑定到另一个值。而是使用 minWidth/Height、prefWidth/Height、maxWidth/Height 属性。
  • 场景具有高度和宽度属性,您可以根据需要绑定到该属性。如果你这样做,当舞台调整大小时,场景将被调整大小,然后你的绑定组件将被调整大小。如果场景的根是布局窗格而不是组,则通常不需要此绑定。
  • 如果您没有在场景上设置高度和宽度,对于独立应用程序,场景(和舞台)的大小将调整为适合场景根节点的首选大小(通常是您想要的)。
  • 如果一切都失败了,您可以开始覆盖 Parent 的 layoutchildren 方法。

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

于 2012-04-25T19:34:35.613 回答
7

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

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

更新:

要实现自动调整百分比布局,您可以GridPane使用ColumnConstraint

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();
}
于 2012-04-26T08:33:04.007 回答
3

建议:

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