在JavaFX中,如何在布局计算期间获得子级的实际大小?

在JavaFX中,如何在布局计算期间获得子级的实际大小?,java,javafx,Java,Javafx,我刚刚开始学习JavaFX构建桌面应用程序,目前还没有任何个人培训。现在关于这个问题,我正在尝试创建一个自定义布局,它的大小取决于它的子对象的总体大小。我的问题是,在计算身高和宽度时,得到每个孩子的大小。在这里,我使用getLayoutBounds()方法来检索子对象的大小,但在我的例子中它总是返回0: @Override protected double computePrefWidth(double height) { for (int i = 0; i < getChildren

我刚刚开始学习JavaFX构建桌面应用程序,目前还没有任何个人培训。现在关于这个问题,我正在尝试创建一个自定义布局,它的大小取决于它的子对象的总体大小。我的问题是,在计算身高和宽度时,得到每个孩子的大小。在这里,我使用
getLayoutBounds()
方法来检索子对象的大小,但在我的例子中它总是返回0:

@Override
protected double computePrefWidth(double height) {
  for (int i = 0; i < getChildren().size(); i++) {
    Node node = getChildren().get(i);
    System.out.println(node.getLayoutBounds().getWidth()); // returns 0
  }
}
@覆盖
受保护的双computePrefWidth(双高){
对于(int i=0;i
因此,我猜这是关于布局通行证的问题(比如说,孩子还没有布置好)。但不管怎样,如果这里是这样还是不这样,我如何才能得到节点的确切大小,包括插入、填充等。?谢谢你的回答


更新 我最终使用了
prefWidth()
prefHeight()
方法,这是正确的答案。使用
getWidth()
getHeight()
方法是我的错误,因为我认为
prefWidth()
方法不包括填充/插入。另一方面,
getWidth()
实际上依赖于布局过程,这意味着它返回0,因为节点(子节点)尚未在阶段中布局,这就是@ᴇʟᴇvᴀтᴇ'下面的答案是正确的

因此,为了其他遇到这种情况的人着想,您可能需要阅读其中一个,最后,如果您使用
pref
min
max
方法(请参见下面@fabian和@silasgyem的答案)没有得到预期的结果,请确保所有CSS样式表都正确应用。

getWidth()
返回
0
,直到显示阶段并布局节点。之后,它们将具有非零宽度

使用
runLater()
在布局后运行操作

Platform.runLater(() -> {
    // TODO: Calculations based on laid out sizes
});
getWidth()
返回
0
,直到显示阶段并布局节点。之后,它们将具有非零宽度

使用
runLater()
在布局后运行操作

Platform.runLater(() -> {
    // TODO: Calculations based on laid out sizes
});

设置子类的setPrefWidth,然后使用getPrefWidth访问它们。设置子类的setPrefWidth,然后使用getPrefWidth访问它们。如果实现自定义的
区域(或间接子类),则确定子类的大小是类的工作

computePrefWidth
ect。需要考虑孩子的大小界限,并根据这些值确定自己的首选大小。对于这些类型的计算,应使用
节点的、、和方法

例子
上述确定pref大小的方法将适用于
VBox

之类的东西。如果实现自定义
区域(或间接子类),则确定子类的大小是类的工作

computePrefWidth
ect。需要考虑孩子的大小界限,并根据这些值确定自己的首选大小。对于这些类型的计算,应使用
节点的、、和方法

例子
上述确定pref大小的方法将适用于
VBox

之类的东西,从而节省了我的搜索时间。非常感谢。我会尽快接受这个答案。这个问题的关键是,要返回的局部变量不能在lambdas中修改。但这确实很有用,节省了我的搜索时间。非常感谢。我会尽快接受这个答案。这个问题的关键是,要返回的局部变量不能在lambdas中修改。谢谢你的回答谢谢你的回答