栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

获取JavaFX中节点的高度(生成布局过程)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

获取JavaFX中节点的高度(生成布局过程)

你需要做的是:

  1. 创建要放置在
    VBoxes
    中的节点。
  2. 将它们添加到某个场景(它可以是一个新的虚拟场景,未附加到舞台上,但具有与主场景相同的CSS规则)。
  3. 在每个节点(或虚拟场景根)上调用
    applyCss()
    layout()
  4. 测量每个节点的布局范围。
  5. 根据布局算法将节点添加到真实场景中的
    VBoxes

有关

要了解如何测量节点的大小,请参见以下答案:

背景

JavaFX布局计算通过应用CSS和布局传递来工作。通常,这是作为脉冲的一部分发生的(内部JavaFX系统中的一种自动60fps滴答,它检查场景中是否有脏物体需要应用新的CSS或布局)。在大多数情况下,你可以只指定要对场景进行的更改,然后由自动脉冲布局机制处理当时的布局。这样做非常有效,因为这意味着脉冲之间的任何更改都会被分批处理,并且你无需手动触发布局遍历。但是,当你需要在布局发生之前实际获得事物的大小时(如你的情况),那么在尝试查询节点的高度和宽度范围之前,需要手动触发CSS应用程序和布局传递。

文献资料

不幸的是,该

node.applyCSS()
方法的详细
Java 8u20 Javadoc
当前已被破坏,因此我将在此处重现Javadoc代码中的示例,因此你可以在上下文中看到推荐的用法。对于下一个Java功能版本(8u40),已修复损坏的
Javadoc
,作为
RT-38330
的一部分,Node类的几种方法都缺少
Javadoc
,因此在该版本中,你将能够在
JavaFX javadoc
中找到以下文本:

如果需要,将样式应用于此节点及其子节点(如果有)。通常不需要直接调用此方法,但可以与layout()下一个脉冲之前(如果场景不在舞台中)确定节点的大小一起使用。

假设Node的Scene不为null,则将此CSS应用于该Node,无论此Node的CSS状态是否干净。CSS样式是从此Node的最上级父级应用的,其CSS状态为非干净状态,这可能会影响其他节点的样式。如果节点不在场景中,则此方法为空操作。场景不必处于舞台中。

此方法不调用该

layout()
方法。通常,调用方将使用以下操作序列。

parentNode.applyCss();parentNode.layout();

作为更完整的示例,以下代码使用

applyCss()
layout()
查找舞台显示之前的
Button
的宽度和高度。如果对
applyCss()
或的调用
layout()
被注释掉,则对
getWidth()
和的调用
getHeight()
将返回零(直到显示舞台后的某个时间)。

public void start(Stage stage) throws Exception {   Group root = new Group();   Scene scene = new Scene(root);   Button button = new Button("Hello World");   root.getChildren().add(button);   root.applyCss();   root.layout();   double width = button.getWidth();   double height = button.getHeight();   System.out.println(width + ", " + height);   stage.setScene(scene);   stage.show();}

另类

此处的另一个选项是覆盖layoutChildren()父节点的方法,即“在布局传递期间调用以在此父节点中布局子级”。这样做时,computePrefHeight()对于prefWidth和min&max height&width的方法以及其他计算方法,可能也有必要覆盖它们。使用此方法的详细说明很复杂,超出了此答案的范围。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/414870.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号