如何在JavaFX中进行布局计算时获取子节点的实际大小?

时间:2018-05-23 07:11:07

标签: java javafx

我刚开始学习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
  }
}

所以我猜这是关于 布局传递 (比如,孩子还没有布局)。但无论如何,如果是这种情况,我怎样才能获得节点的确切大小,包括插图,填充等?谢谢你的所有答案。

更新

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

因此,为了遇到其他人,您可能需要阅读this一个,最后,如果您没有获得{{1}的预期结果,请确保所有CSS样式表都已正确应用},prefmin方法(请参阅@fabian和@SilasGyeme的答案)。

3 个答案:

答案 0 :(得分:2)

getWidth()返回0,直到您显示舞台并布置节点。之后,它们将具有非零宽度。

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

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

答案 1 :(得分:2)

如果您实施自定义Region(或间接子类),那么它就是您的课程&#39;确定孩子大小的工作。

computePrefWidth等。需要考虑孩子的大小范围,并根据这些值确定自己的首选大小。对于这些类型的计算,您应该使用{{1}的minWidthminHeightprefWidthprefHeightmaxWidthmaxHeight方法}。

实施例

Node

确定pref大小的上述方法将是合适的,例如,类似于@Override protected double computePrefWidth(double height) { double size = 0; for (Node child : getManagedChildren()) { double pW = child.prefWidth(height); if (pW > size) { size = pW; } } // TODO: consider insets ect... return size; }

答案 2 :(得分:1)

设置子项的setPrefWidth,然后使用getPrefWidth

访问它们