窗格中的填充宽度

2022-09-04 00:43:06

有一个像它一样的根源和一个像它的孩子一样。根目录随舞台一起调整大小。如何实现自动调整根目录的大小以填充宽度?任何宽度都应该是可能的。在没有属性绑定的情况下是否可能?PaneGridPaneGridPane

情况如下:

  1. (黄色)是 的根,因此它填充 了 的宽度和高度。PaneSceneStage
  2. A(绿色),其中一行和 3 个腔作为根的子GridPane
  3. 该行应具有固定的高度。
  4. 第一列和第三列应具有恒定大小
  5. 中间列应增长到最大
  6. 应填充其父项的宽度GridPane

不幸的是,没有填充宽度:GridPaneGridPane should fill the width of its parent

法典:

@Override
public void start(Stage primaryStage) throws Exception {
    // Resizes with the stage
    final Pane root = new Pane();
    root.setStyle("-fx-background-color: yellow");

    // grid: 1 row, 3 colums
    // should have a constant height and should grow in width to fill parent pane
    final GridPane gridPane = new GridPane();
    root.getChildren().add(gridPane);
    gridPane.setStyle("-fx-background-color: green");
    gridPane.setGridLinesVisible(true);

    final RowConstraints row = new RowConstraints(100); // constant height = 100
    final ColumnConstraints col1 = new ColumnConstraints(100, Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
    // should grow as much as possible in width
    final ColumnConstraints col2 = new ColumnConstraints(200, Control.USE_COMPUTED_SIZE, Double.MAX_VALUE);
    final ColumnConstraints col3 = new ColumnConstraints(100, Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);
    gridPane.getRowConstraints().add(row);
    gridPane.getColumnConstraints().addAll(col1, col2, col3);

    final Scene scene = new Scene(root);
    primaryStage.setScene(scene);
    primaryStage.setWidth(600);
    primaryStage.setHeight(400);
    primaryStage.show();
}

答案 1

窗格内节点的大小由各个窗格实现其布局的方式控制:即节点的大小由其父级有效确定。因此,网格窗格的总体大小由 的布局实现控制。Pane

Pane实际上做了最小的布局工作:它有效地将所有内容定位在(0,0)并将其大小调整为其首选大小。因此,网格窗格将获得其首选宽度,即列的首选宽度之和。

因此,要使网格窗格增长,您需要更改其首选宽度,或者使用允许您控制其增长方式的布局窗格。

例如:

gridPane.prefWidthProperty().bind(root.widthProperty());

将使网格窗格增长到根的宽度。这只会在所有三列的右侧添加额外的空间,因此请额外设置

col2.setHgrow(Priority.ALWAYS);

会让有额外的宽度。col2

或者,将 for 用于 :AnchorPaneroot

// Pane root = new Pane();
AnchorPane root = new AnchorPane();

和设置

AnchorPane.setLeftAnchor(gridPane, 0.0);
AnchorPane.setRightAnchor(gridPane, 0.0);

(再次与集合)将具有相同的效果。col2hgrow

或者你可以做

VBox root = new VBox();
root.setFillWidth(true);

(例如:有很多解决方案)。

解决方案的选择取决于您在根窗格中拥有的其他节点(如果有)。


答案 2

Pane不会自动布局其子级。请尝试改用。它将通过(如果可能)调整其子空间的大小来填充可用空间的宽度。这样,GridPane将在舞台宽度变化时调整大小。VBox

现在,您可以管理网格窗格列共享空间的方式。根据您的描述,设置就足够了

col2.setHgrow( Priority.ALWAYS );