我尝试在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)。 另外,我想确保其他组件正确匹配。
答案 0 :(得分:0)
我自己找到了解决方案。
要获得正确的宽度和高度,您必须分别拨打Region.prefWidth(-1)
和Region.prefHeight(-1)
。
这两个功能的目的是:
在布局期间调用以确定此节点的首选宽度/高度。