当前位置: 首页 > 知识库问答 >
问题:

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

颜英博
2023-03-14

我刚刚开始学习JavaFX来构建桌面应用程序,目前还没有任何个人培训。现在关于这个问题,我正在尝试做一个自定义布局,它的大小取决于它的孩子的整体大小。我的问题是在计算高度和宽度时得到每个孩子的尺寸。这里,我使用< code>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
  }
}

所以我想这是关于布局传递的(比如说,孩子还没有布局)。但是不管怎样,如果这里是不是这样,我怎样才能得到节点的确切大小,包括插页、填充等?谢谢你的所有回答。

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

因此,为了其他遇到这种情况的人,你可能想读一下这篇文章,最后,如果你没有用< code>pref、< code>min、< code>max方法得到预期的结果,请确保所有的CSS样式表都被正确应用(见下面@fabian和@SilasGyeme的回答)。

共有3个答案

申屠黎昕
2023-03-14

设置设置子项的首选项宽度,然后使用获取首选项宽度访问它们

唐声
2023-03-14

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

使用< code>runLater()运行布局后操作。

Platform.runLater(() -> {
    // TODO: Calculations based on laid out sizes
});
高慈
2023-03-14

如果您实现了自定义Area(或间接子类),则确定子类的大小是您的类的工作。

computePrefWidth等。需要考虑子节点的大小边界,并根据这些值确定自己的首选大小。对于这些类型的计算,您应该使用minWidthminHeightprefWidthprefHeightmaxWidthmaxHeightNode的方法。

@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;
}

上述确定首选项大小的方法适用于VBox之类的情况。

 类似资料:
  • 如何在JavaFX中获取节点的高度或首选高度,我有3个,我想将节点添加到最自由的面板中,例如: 在本例中,最自由的是,我使用此方法计算最自由的窗格: 此方法仅在我同时添加1个元素时有效。但如果我当时添加更多元素: 方法返回相同的索引。这是因为新节点在本地还没有高度。 因此这行: 将返回带有新节点的。 有人知道如何获得节点的高度吗? Node的扩展 方法addElement()在myPane: 假设

  • 问题内容: 如何在JavaFX中获取节点的高度或首选节点的高度,我有3个节点,我想将节点添加到最自由的面板中,例如: 在这种情况下,最自由的是,我使用这种方法计算出最自由的窗格: 仅当我一次添加1个元素时,此方法才有效。但是如果我一次添加更多元素: 该方法getFreerColumnIndex返回相同的索引。这是因为新节点在本地还没有高度。 所以这行: 将0与新节点一起返回。 有谁知道如何获得节点

  • 问题内容: 如何在JavaFX中获取节点的高度或首选节点的高度,我有3个节点VBox,我想将节点添加到最自由的面板中,例如: 在这种情况下,最免费的是VBoxB,我使用这种方法计算出最免费的窗格: 仅当我一次添加1个元素时,此方法才有效。但是如果我一次添加更多元素: 该方法getFreerColumnIndex返回相同的索引。这是因为新节点在本地还没有高度。 所以这行: 将0与新节点一起返回。 有

  • 问题内容: 在JavaFX中获取节点绝对位置的最佳方法是什么? 假设我们在窗格(Hbox,Stackpane或任何其他窗格)中有一个节点,并且它本身可能有一个父节点。 我想获取该节点的绝对位置,并在另一个窗格中使用它。 问题答案: 这取决于您所说的“绝对”的含义。节点有一个坐标系,父节点有一个坐标系,父节点有一个坐标系,依此类推,最终有一个坐标系和一个屏幕坐标系(可能是物理显示设备的集合)。 您可

  • 我正在使用D3进行web爬虫可视化,它使用了一个基于强制的标签图,如下面所示:基于强制的标签放置图

  • 在C#中,我发现了一个非常可爱的方法,它允许您从指定的控件中获取所有后代及其所有后代。 我正在寻找一种类似的JavaFX方法。 我看到<code>Parent</code>类是我想要使用的,因为它是派生所有节点类的子类。 这就是我到目前为止所拥有的(我还没有在谷歌上找到任何像“JavaFX从场景中获取所有节点”这样的搜索): 那么,如何判断N是否是父级(或从父级扩展)?我这样做对吗?它似乎不起作用