我无法弄清楚如何获得StackPane的宽度:
如果我引用http://docs.oracle.com/javafx/2.0/api/javafx/scene/layout/StackPane.html,StackPane的维度应该适应它的内容:
堆栈窗格的父级将在堆栈窗口的可调整大小范围内调整堆栈窗口的大小 布局。默认情况下,stackpane会根据其中的内容计算此范围 下表。
preferredWidth左/右插图加上子节点宽度的最大值。
这里的语法是scala,但问题与javafx有关:
import javafx.scene.layout.StackPane
import javafx.scene.shape.Rectangle
class Bubble() extends StackPane {
val rect = new Rectangle(100, 100)
getChildren.add(rect)
println(rect.getWidth)
println(this.getWidth)
}
Output :
>> 100.0
>> 0.0 <- Why isn't it 100 ?
这是一个错误还是等待的行为?如何获得StackPane的内容宽度?
感谢名单
答案 0 :(得分:3)
布局管理器(实际上所有可调整大小的对象)在实际显示应用程序之前不会更新其边界。 Rectangle给出宽度为100,因为它是构造函数的默认值。
见下一段代码:
@Override
public void start(Stage stage) throws Exception {
StackPane root = new StackPane();
Rectangle rect = new Rectangle(100, 100);
root.getChildren().add(rect);
// 100 - 0
System.out.println(rect.getWidth());
System.out.println(root.getWidth());
stage.setScene(new Scene(root));
// 100 - 0
System.out.println(rect.getWidth());
System.out.println(root.getWidth());
stage.show();
// 100 - 100
System.out.println(rect.getWidth());
System.out.println(root.getWidth());
}
所以你需要等待StackPane显示。或者更好地依赖JavaFX并使用绑定。 E.g。
stage.titleProperty().bind(root.widthProperty().asString());