javafx自定义布局窗格:标签始终为其首选宽度和高度返回-1

时间:2015-04-25 00:10:18

标签: java layout javafx

我尝试在javafx中实现自定义布局窗格,它将所有节点放在围绕其中心的圆圈中。 问题是我的节点总是返回-1.0,因为它们的首选宽度和最小宽度和高度属性。这是我的班级:

public class CirclePane extends Region {

@Override
protected void layoutChildren() {
    double middleX = getWidth() / 2;
    double middleY = getHeight() / 2;
    double factor = Math.min(getWidth(), getHeight()) * 0.45;// how far from the middle the nodes will be arranged
    double degreesPerChild = 2 * Math.PI / getChildren().size();
    for (int i = 0; i < getChildren().size(); i++) {
        if(getChildren().get(i) instanceof Region){
            Region r = (Region) getChildren().get(i); // I believe I need region to get any sizes?
            double prefW = Math.max(r.getMinWidth(), r.getPrefWidth()); //My attempt to get a reliable preferredwidth and height
            double prefH = Math.max(r.getMinHeight(), r.getPrefHeight());

            double degrees = i * degreesPerChild;
            double xPos = Math.sin(degrees) * factor + middleX - prefW / 2;
            double yPos = Math.cos(degrees) * factor + middleY - prefH / 2;
            layoutInArea(r, xPos , yPos, prefW, prefH, 0.0d, HPos.LEFT, VPos.CENTER);
        }
    }
}

@Override
public ObservableList<Node> getChildren() {
    return super.getChildren();
}

它可以工作,但所有节点都向右移动(几个像素,大约是它们的宽度/ 2)。 另外,我想确保其他组件正确匹配。

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。 要获得正确的宽度和高度,您必须分别拨打Region.prefWidth(-1)Region.prefHeight(-1)

这两个功能的目的是:

  

在布局期间调用以确定此节点的首选宽度/高度。