如何通过调整组件大小来绑定舞台大小调整?

时间:2012-04-25 15:07:45

标签: javafx javafx-2 fxml

我有一个带FXML的JavaFX 2.0应用程序。 我希望在调整带有应用程序的窗口时调整组件(TextFields,ComboBoxes,layouts等)的大小。 所以......

  

使用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控件没有任何width \ height属性,只能绑定到某些东西。或许我还没有找到它们。

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

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角的坐标。

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

3 个答案:

答案 0 :(得分:20)

有关构建可调整大小的guis =&gt;

的一些建议
  • 确保您的应用的根目录是Pane子类,而不是组。
  • 取消按钮的最大尺寸(例如button.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE)。
  • 大多数情况下,布局窗格可以为您处理调整大小,而您不需要绑定和侦听器=&gt;即只在你真正需要时才绑定。
  • UI控件和布局窗格是Regions =&gt;所有Regions都具有只能读取和绑定的高度和宽度属性。
  • 您无法直接将控件的高度和宽度属性绑定到另一个值。而是使用minWidth / Height,prefWidth / Height,maxWidth / Height属性。
  • 如果需要,可以绑定场景的高度和宽度属性。如果执行此操作,则在调整舞台大小时,将调整场景大小,然后调整绑定的组件的大小。如果场景的根是布局窗格而不是组,则通常不需要此绑定。
  • 如果您没有在场景中设置高度和宽度,对于独立应用程序,场景(和舞台)的大小将适合场景根节点的首选大小(通常是您想要的)。
  • 如果所有其他方法都失败了,您可以重新启动Parent的layoutchildren方法。

以下是可调整大小的JavaFX UI的an example,它实现了上述一些原则。

答案 1 :(得分:7)

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

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

更新:

要实现自动调整百分比布局,您可以将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();
}

答案 2 :(得分:3)

建议:

  1. 如果您只有一个主舞台,则在app启动时将其存储在静态字段/变量中,并在所有控制器类中访问它。
  2. 您可以将所有控件/组件放入自动管理其子布局的布局/窗格中。对于不同的布局,请查看api doc。之后,将舞台场景的width和height属性相应地绑定到此布局的属性。关于绑定的更多内容请看Using JavaFX Properties and Binding unidirectional binding
  3. 的示例