JavaFX - 如何让GridPane适应父容器

17

我有一个简单的GridPane,里面有几个标签和一个按钮,但是我似乎无法使其适应父级StackPane。我该如何让它填充包含它的任何容器?

    GridPane g = new GridPane();
    g.add(new Label("Categories"),0,0);
    g.add(new Label("Content"),1,0);        
    Button newCat = new Button("New Category");
    newCat.setOnAction(new EventHandler<ActionEvent>() {
        @Override public void handle(ActionEvent e) {
            System.out.println("Clicked");
        }
    });       
    g.add(newCat,0,1);
    g.setGridLinesVisible(true);
    StackPane root = new StackPane();
    root.getChildren().add(g);        
    Scene scene = new Scene(root, 300, 250);  
    primaryStage.setScene(scene);
    primaryStage.show();

UI真的不是我的强项,任何帮助都将不胜感激。

5个回答

13

你应该查看这个链接,特别是关于百分比大小的部分。如果你只有两列,我发现以下代码可行:

GridPane grid = new GridPane();
/* your code */
ColumnConstraints column1 = new ColumnConstraints();
column1.setPercentWidth(50);
grid.getColumnConstraints().add(column1);

3
这确实有效。我曾因为我的网格面板不适配父元素而感到很困惑,但现在它可以了。还有一点:这种方法即使有两列以上也可以使用,只需相应地调整数值即可! - Matteo A
谢谢,我已经将你的注释添加到答案中了。 - Videl

8
如果有人正在寻找答案,这就是对我有效的方法:

在我的情况下,解决方案如下:

@Override
public void start(Stage stage) throws Exception {
    stage.setTitle("Window title");
    GridPane grid = new GridPane();

    gridSetup(grid); // Building my grid elements here (2 columns)

    // Setting columns size in percent
    ColumnConstraints column = new ColumnConstraints();
    column.setPercentWidth(30);
    grid.getColumnConstraints().add(column);

    column = new ColumnConstraints();
    column.setPercentWidth(70);
    grid.getColumnConstraints().add(column);

    grid.setPrefSize(WINDOW_WIDTH, WINDOW_HEIGHT); // Default width and height
    grid.setMaxSize(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE);

    Scene scene = new Scene(grid, WINDOW_WIDTH, WINDOW_HEIGHT);
    stage.setScene(scene);
    stage.show();
}

通过这种设置,网格将占据窗口的所有空间,并随窗口自动调整大小。


4

假设你的布局有2列和3行,你可以逐个定义列和行的大小属性:

  <GridPane 
    xmlns:fx="http://javafx.com/fxml/1"    
    id="gridPane" 
    prefHeight="768.0" 
    prefWidth="1024.0">     

    <gridLinesVisible>true</gridLinesVisible> 
    <columnConstraints>
        <ColumnConstraints percentWidth="20"  /> 
        <ColumnConstraints percentWidth="80" />        
    </columnConstraints>

    <rowConstraints>
        <RowConstraints minHeight="50"/> 
        <RowConstraints percentHeight="80"/>  
        <RowConstraints minHeight="50"/>  
    </rowConstraints> 

</GridPane>

1

虽然不是很明显,但我认为您的GridPane已经和其父容器一样大了。 如果在“Scene scene = new Scene(root, 300, 250);”之前添加以下两行代码,您就可以看到发生了什么。

root.setStyle("-fx-background-color: yellow;");
g.setStyle("-fx-border-color: blue;");

据我所见,它似乎无法扩展到父级。 - John Mikael Gundersen
GridPane不知道如何重新分配额外的宽度和高度。你需要定义它。你想让第一行占据所有额外的垂直空间,第二列占据所有额外的水平空间吗?你考虑过使用TableView吗? - ytw

0
不要将GridPane放在StackPane中,而应该将其添加到HBox或VBox中。这样更方便调整你的GridPane。另外,你仍然可以使用g.setPrefSize(arg0, arg1)等方法来设置高度和宽度。

我知道,但是通过设置首选大小,它不会按比例缩放到父级,它只是设置FX将尝试使用的大小,但我会尝试将其放在HBox中,虽然我很难相信这会解决我的问题,因为它不会重新调整其他项目,如按钮等...但我会尝试^^ - John Mikael Gundersen
很抱歉要这么说,但无论是HBox还是VBox对GridPanes的大小都没有任何影响,使其填充父容器。 - John Mikael Gundersen
@JohnMikaelGundersen 尝试这样做,并相应地调整您的网格约束。[链接] http://pastebin.com/rA0Ch8ET - Bipin Bhandari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接