如何在JavaFX中获取节点的高度或首选节点的高度,我有3个节点VBox
,我想将节点添加到最自由的面板中,例如:
Childrens Total Height of the children's(Sum)
VBoxA 5 890
VBoxB 4 610
VBoxC 2 720
在这种情况下,最自由的是VBoxB
,我使用这种方法计算出最自由的窗格:
private int getFreerColumnIndex() {
if(columns.isEmpty())
return -1;
int columnIndex = 0;
int minHeight = 0;
for(int i = 0; i < columns.size(); i++) {
int height = 0;
for(Node n : columns.get(i).getChildren()) {
height += n.getBoundsInLocal().getHeight();
}
if(i == 0) {
minHeight = height;
} else if(height < minHeight) {
minHeight = height;
columnIndex = i;
}
if(height == 0)
break;
}
return columnIndex;
}
仅当我一次添加1个元素时,此方法才有效。但是如果我一次添加更多元素:
for (int i = 0; i < 10; i++) {
SomeNode r1 = new SomeNode ();
myPane.addElement(r1);
}
该方法getFreerColumnIndex返回相同的索引。这是因为新节点在本地还没有高度。
所以这行:
height += n.getBoundsInLocal().getHeight();
将0与新节点一起返回。
有谁知道如何获得节点的高度?
Extra:
SomeNode 延伸 Node
myPane的方法addElement():
public void addElement(final Node element) {
index = getFreerColumnIndex();
columns.get(index).getChildren().add(element);
}
Extra 2:
假设我们有3个vbox:之前:
A B C
| | |
| |
|
Run:
for (int i = 0; i < 10; i++) {
SomeNode r1 = new SomeNode ();
myPane.addElement(r1);
}
After:
A B C
| | |
| | |
| |
|
|
|
|
|
|
|
|
Correct:
A B C
| | |
| | |
| | |
| | |
| | |
|
| =
一些节点
你需要做的是:
VBoxes
中的节点。applyCss()
和layout()
。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的方法以及其他计算方法,可能也有必要覆盖它们。使用此方法的详细说明很复杂,超出了此答案的范围。
如何在JavaFX中获取节点的高度或首选高度,我有3个,我想将节点添加到最自由的面板中,例如: 在本例中,最自由的是,我使用此方法计算最自由的窗格: 此方法仅在我同时添加1个元素时有效。但如果我当时添加更多元素: 方法返回相同的索引。这是因为新节点在本地还没有高度。 因此这行: 将返回带有新节点的。 有人知道如何获得节点的高度吗? Node的扩展 方法addElement()在myPane: 假设
问题内容: 如何在JavaFX中获取节点的高度或首选节点的高度,我有3个节点VBox,我想将节点添加到最自由的面板中,例如: 在这种情况下,最免费的是VBoxB,我使用这种方法计算出最免费的窗格: 仅当我一次添加1个元素时,此方法才有效。但是如果我一次添加更多元素: 该方法getFreerColumnIndex返回相同的索引。这是因为新节点在本地还没有高度。 所以这行: 将0与新节点一起返回。 有
我正在开发一个应用程序,有必要将节点布置在彼此之外(或彼此顶部等)。但是,此布局只是初始布局,用户可以任意移动这些节点。在JavaFX中,如何以正确的方式实现这一点?我将用一个简单的例子来解释我的问题: 假设我有两个矩形,想把矩形2放在矩形1的右边。 在这种情况下,JavaFX还没有确定rect1的宽度,它将为零。直观地说,我会执行一个调用,让JavaFX绘制rect1,从而确定其宽度,然后添加r
我正在用flexbox做实验,并创建了这个布局。我试图让中间写着“嘿”的白色方框成为父方框的90%宽度/高度,但百分比似乎不会影响它。(我把它设置为100px/100px目前工作) 这很奇怪,因为父节点在检查时有一个定义的宽度/高度。 有人能告诉我如何实现吗?(此外,对我如何使用flexbox的一般批评也很赞赏) http://jsfiddle.net/yv3Lw5gy/1/ 相关类别:
问题内容: 如何获取JavaFx中Webview控件的文档高度? 问题答案: 您可以使用以下调用获取WebView中显示的文档的高度: 演示呼叫使用情况的完整应用程序: 上面的答案的来源:Oracle JavaFX论坛WebView配置线程 。 针对基于Java的API的相关功能的相关问题跟踪器请求: RT-25005 WebView的自动首选大小。
问题内容: 我感兴趣的是建议/伪代码/解释,而不是实际的实现。 我想通过xml文档,及其所有节点 检查节点是否存在属性 如果节点不具有属性, 则为Case;如果节点确实具有属性,则为Case,迭代槽属性列表,并为每个属性(包括该节点)创建xpath。 忠告?希望你会提供一些有用的信息 编辑: 这样做的原因是..我正在用jmeter编写自动化测试,因此对于每个请求,我都需要验证该请求是否确实完成了工