JavaFX: ширина кнопки в пользовательской области сетки

Я хотел бы иметь кнопки с равной (максимальной) шириной в области сетки.

Когда я пытаюсь установить его прямо в FXML, он работает отлично.

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.layout.*?>
<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="TestController">
    <children>
        <GridPane AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.bottomAnchor="0"
                  AnchorPane.topAnchor="0">
            <columnConstraints>
                <ColumnConstraints hgrow="SOMETIMES" percentWidth="50.0"/>
                <ColumnConstraints hgrow="SOMETIMES" percentWidth="50.0"/>
            </columnConstraints>
            <children>
                <Button maxWidth="Infinity" text="Button1" GridPane.columnIndex="0"/>
                <Button maxWidth="Infinity" text="Button2" GridPane.columnIndex="1"/>
            </children>

        </GridPane>
    </children>
</AnchorPane>

Но когда я захотел разделить всю сетку на пользовательский элемент управления, кнопки остановились, чтобы заполнить доступную ширину.

Вот FXML:

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import CustomGridPane?>
<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="TestController">
    <children>
        <CustomGridPane AnchorPane.leftAnchor="0" AnchorPane.rightAnchor="0" AnchorPane.bottomAnchor="0" AnchorPane.topAnchor="0">
        </CustomGridPane>
    </children>
</AnchorPane>

И расширение:

public class CustomGridPane extends GridPane {

    private Button button1 = new Button("button1");
    private Button button2 = new Button("button2");

    public CustomGridPane() {
        super();
        button1.maxWidth(Double.MAX_VALUE);
        button2.maxWidth(Double.MAX_VALUE);

        getColumnConstraints().add(new ColumnConstraints());
        getColumnConstraints().add(new ColumnConstraints());
        getColumnConstraints().get(0).setPercentWidth(50);
        getColumnConstraints().get(0).setHgrow(Priority.SOMETIMES);
        getColumnConstraints().get(1).setPercentWidth(50);
        getColumnConstraints().get(1).setHgrow(Priority.SOMETIMES);

        add(button1, 0, 0);
        add(button2, 1, 0);
    }
}

Я что-то упускаю?


person wlek    schedule 09.01.2015    source источник


Ответы (2)


Вы используете метод получения свойства maxWidth вместо метода setMaxWidth (сеттер).

См. документацию по кнопке здесь

общедоступный окончательный двойной maxWidth (двойная высота)

Вызывается во время компоновки, чтобы определить максимальную ширину для этого узла. Возвращает значение из calculateMaxWidth(forHeight), если только приложение не переопределило максимальную ширину, установив свойство maxWidth.

Замените две строки с maxWidth(...) на эти:

    button1.setMaxWidth(Double.MAX_VALUE);
    button2.setMaxWidth(Double.MAX_VALUE);
person VinceOPS    schedule 10.01.2015
comment
Да, это так очевидно. Не могу поверить, что так долго смотрел на него и не заметил.. Спасибо. - person wlek; 10.01.2015

Это также может быть достигнуто внутри конструктора сцен...

Следуйте за черной стрелкой

Мне это потребовалось при создании калькулятора с кнопками внутри сетки.

Удачного кодирования (:

person Pratham Sarankar    schedule 14.07.2020