JavaFX:自定义网格中按钮的宽度

3

我希望在网格面板中有等宽(最大宽度)的按钮。

当我尝试直接在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);
    }
}

我有什么遗漏吗?

2个回答

5
您正在使用maxWidth属性的getter方法而不是setMaxWidth(setter)方法。
请查看此处Button的文档
在布局期间调用public final double maxWidth(double height)以确定此节点的最大宽度。除非应用程序通过设置maxWidth属性覆盖了最大宽度,否则将返回computeMaxWidth(forHeight)中的值。
请使用以下这些行替换两行maxWidth(...):
    button1.setMaxWidth(Double.MAX_VALUE);
    button2.setMaxWidth(Double.MAX_VALUE);

1
是的,这很明显。我不敢相信我盯着它看了那么久,却没有注意到它。谢谢你。 - wlek

0

这也可以在场景构建器中实现...

Follow the black arrow

在创建带有网格面板内按钮的计算器时,我需要这个。

编程愉快(:


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