我尝试在 javafx 中实现一个自定义布局 Pane ,它将所有节点围绕其中心放置在一个圆圈中。 问题是我的节点的首选宽度、最小宽度和高度属性总是返回 -1.0。这是我的类(class):
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)。 另外,我想确保其他组件正确安装。
最佳答案
我自己找到了解决方案。
要获得正确的宽度和高度,您必须调用 Region.prefWidth(-1)
和 Region.prefHeight(-1)
分别。
这两个函数的目的是:
Called during layout to determine the preferred width/height for this node.
关于javafx自定义布局 Pane : label always returns -1 for its preferred width and height,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29859499/