JavaFX - GridPane 行在将图片插入按钮后增加高度

JavaFX - GridPane row increases in height after inserting a picture into a button

我有一个按钮网格。当我点击一个按钮时,一个 ImageView 被插入其中并且由于某种原因单元格高度增加。我不明白为什么以及如何解决它。如何使单元格大小不变?

点击按钮后第一行高度增加。

我的控制器class:

public class Controller {
    public GridPane gameTable;
    public Label score1;
    public Label score2;
    Image openImage = new Image(getClass().getResourceAsStream("/open.jpg"));
    MyButton open1;
    MyButton open2;
    Player player1 = new Player();
    Player player2 = new Player();
    Player currentPlayer = player1;

    public void initialize(){
        System.out.println(gameTable.getRowCount()+" "+gameTable.getColumnCount());
        for (int i = 0; i < 6; i++) {
            for (int j = 0; j < 5; j++) {

                MyButton btn = new MyButton(i);
                btn.setMaxWidth(Double.MAX_VALUE);
                btn.setMaxHeight(100);
                gameTable.add(btn, i, j);
                btn.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent actionEvent) {

                        ImageView iv = new ImageView(openImage);
                        iv.setPreserveRatio(true);
                        iv.setFitWidth(btn.getWidth()-10);
                        btn.setGraphic(iv);


                    }
                });

            }
        }
    }
}

GridPane 的默认行为是尝试将所有单元格的大小调整为其内容的首选大小。 (如果有额外的 space 可用,它会尝试均匀分配,或者根据节点上设置的约束或行或列约束。)将图像添加到按钮时,会增加按钮的首选高度,因此您增加了分配给包含该按钮的单元格的 space。

您可以通过在 GridPane 上设置 RowConstraints(更改垂直 space 分配给每一行的方式)和 ColumnConstraints(控制水平 space 分配给每一列)。

如果要完全约束每行的高度,设置所有行的minprefmaxHeight

for (int j = 0 ; j < 5 ; j++) {
    RowConstraints rc = new RowConstraints();
    rc.setMinHeight(100);
    rc.setPrefHeight(100);
    rc.setMaxHeight(100);
    gameTable.getRowConstraints().add(rc);
}

如果要按比例设置高度,请使用 setPercentHeight():

for (int j = 0 ; j < 5 ; j++) {
    RowConstraints rc = new RowConstraints();
    rc.setPercentHeight(100.0 / 5);
    gameTable.getRowConstraints().add(rc);
}