JavaFX - строка GridPane увеличивается в высоту после вставки изображения в кнопку - PullRequest
0 голосов
/ 06 мая 2020

У меня есть сетка кнопок. Когда я нажимаю кнопку, в нее вставляется ImageView, и по какой-то причине высота ячейки увеличивается. Не понимаю, почему и как это исправить. Как сделать размер ячейки постоянным?

enter image description here

после нажатия кнопки высота первой строки увеличивается.

enter image description here

Мой класс контроллера:

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);


                    }
                });

            }
        }
    }
}

1 Ответ

3 голосов
/ 06 мая 2020

По умолчанию GridPane пытается изменить размер всех ячеек до желаемого размера их содержимого. (Если есть дополнительное пространство, он попытается распределить его равномерно или в соответствии с ограничениями, установленными для узлов, строк или столбцов.) Когда вы добавляете изображение на кнопку, вы увеличиваете предпочтительную высоту кнопки, поэтому вы увеличиваете пространство, выделенное ячейке, содержащей эту кнопку.

Вы можете изменить поведение по умолчанию, установив RowConstraints в GridPane (чтобы изменить способ распределения вертикального пространства для каждой строки) и ColumnConstraints (чтобы контролируйте горизонтальное пространство, выделенное для каждого столбца).

Если вы хотите полностью ограничить высоту каждой строки, установите min, pref и maxHeight для всех строк:

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);
}
...