JavaFX Region的布局问题

时间:2016-07-14 23:41:13

标签: layout javafx border subclass region

我想编写一个新类,扩展包含StackPane的Region。但是当我向它添加插入物(如填充或边框)时,我遇到了麻烦。以下是该类的简化示例:

public class CustomPane extends Region
{
    private ToggleButton testControl = new ToggleButton("just a test control");
    private StackPane rootPane = new StackPane(testControl);

    public CustomPane()
    {
        getChildren().add(rootPane);
        setStyle("-fx-border-color: #257165; -fx-border-width: 10;");
    }
}

结果如下:

enter image description here

如果我尝试通过调用

来移动StackPane
rootPane.setLayoutX(10);
rootPane.setLayoutY(10);

然后该地区才会增长:

enter image description here

但我真的希望它看起来像这样:

enter image description here

(第三个图像是通过扩展StackPane而不是Region来创建的,它已经正确地管理了布局内容。不幸的是我必须扩展Region,因为我想保持getChildren()受保护。)

好的,我试图处理布局计算,但我没想出来。专家可以给我一些建议吗?

1 个答案:

答案 0 :(得分:2)

StackPane使用insets来布局(托管)子级。默认情况下,Region不会执行此操作。因此,您需要使用使用这些insets的内容覆盖layoutChildren,例如:

@Override
protected void layoutChildren() {
    Insets insets = getInsets();
    double top = insets.getTop(),
            left = insets.getLeft(),
            width = getWidth() - left - insets.getRight(),
            height = getHeight() - top - insets.getBottom();

    // layout all managed children (there's only rootPane in this case)
    layoutInArea(rootPane,
            left, top, // offset of layout area
            width, height, // available size for content
            0,
            HPos.LEFT,
            VPos.TOP);
}