我刚开始学习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样式表都已正确应用},pref
,min
方法(请参阅@fabian和@SilasGyeme的答案)。
答案 0 :(得分:2)
getWidth()
返回0
,直到您显示舞台并布置节点。之后,它们将具有非零宽度。
使用runLater()
在布局后运行操作。
Platform.runLater(() -> {
// TODO: Calculations based on laid out sizes
});
答案 1 :(得分:2)
如果您实施自定义Region
(或间接子类),那么它就是您的课程&#39;确定孩子大小的工作。
computePrefWidth
等。需要考虑孩子的大小范围,并根据这些值确定自己的首选大小。对于这些类型的计算,您应该使用{{1}的minWidth
,minHeight
,prefWidth
,prefHeight
,maxWidth
和maxHeight
方法}。
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
访问它们