我想创建一组使用JavaFX 8的自定义控件。我有点困惑什么是正确的方式来做一些东西,如布置我定义的孩子建立我的控制。 我用来重写layoutChildren()方法,在这里我重新定位并调整了孩子的大小;但阅读javadoc的layoutChildren()有写:JavaFX 8 - 自定义控件和他们的孩子
在布局过程中调用布局在此父级中的子级。默认情况下,它只会将受管理的可调整大小的内容设置为其首选大小,并且不会执行任何节点定位。
因此,根据文档,我不得执行子节点的任何重定位(“节点定位”)。
我想了解的是在我的自定义控件中定位和调整儿童大小的正确方法是什么。
我不明白的另一件事是layoutChildren()被调用的时间和次数;文档说“在布局阶段调用”,但我不明白何时执行“布局阶段”。
我希望你能帮助我。
编辑@James_D
这是一个例子我在评论说
public class MyControl extends TextField {
private Label label;
public MyControl() {
super();
setSkin(new TextFieldSkin(this));
label=new Label("This is my custom textfield");
getChildren().add(label);
}
@Override
protected void layoutChildren() {
super.layoutChildren();
label.relocate(0, -label.getHeight());
System.out.println("I'm laying out children");
}
}
如果你运行它,你会发现,layoutChildren()被调用每帧
因此,你建议我在重写方法,我可以做节点定位?这似乎违反了超级合同。 – Vin
“默认情况下,x确实......”不是合同。在这种特殊情况下,Javadocs明确告诉你,如果需要的话,子类应该定位节点:“子类应该覆盖此函数以根据需要布置内容。” –
我们可以有一个自定义布局管理器如何工作的想法或形象吗?编写类似代码的可能性很高,因此我们可以提供帮助。 – GOXR3PLUS