JavaFX:在不可见的情况下确定节点的边界?

时间:2017-11-16 15:01:50

标签: javafx

有没有办法确定已经附加到场景但设置为不可见的节点的边界(特别是高度和宽度)?

我想在屏幕上显示一个标签,只要它的宽度超过100px ......但它始终为0:

@Override
public void start(Stage primaryStage) {
    Group root = new Group();
    Scene scene = new Scene(root, 500, 500, Color.BLACK);
    primaryStage.setScene(scene);
    primaryStage.show();

    Label n = new Label();
    n.setVisible(false);
    n.setStyle("-fx-background-color: red;");
    root.getChildren()
        .addAll(n);
    n.textProperty()
        .addListener((v, ov, nv) -> {
            System.out.println(n.getBoundsInParent());
            n.setVisible(n.getWidth() > 100);
        });
    n.setText("TEST11111111111111111111111");
}    

sysout的结果:(也是n.getWidth()不是更好)

  

BoundingBox [minX:0.0,minY:0.0,minZ:0.0,width:0.0,height:0.0,depth:0.0,maxX:0.0,maxY:0.0,maxZ:0.0]

有诀窍吗?

全部谢谢!

1 个答案:

答案 0 :(得分:0)

您的问题是您正在侦听text属性的更改并希望在那时更新节点的宽度 - 但事实并非如此。节点的宽度仅在渲染过程中计算和设置,渲染过程由applyCSS和布局例程组成(请参阅:Get the height of a node in JavaFX (generate a layout pass))。在计算节点的更新大小之前,您的代码错误地将节点设置为不可见。

我建议您使用绑定表达式在visibility属性上创建对所需width属性的直接绑定,而不是在text属性上使用侦听器来确定节点的可见性。下面提供了这种方法的一个例子。您可以看到标签仅在要显示的文本长于所需宽度(在本例中为100像素)时显示。

short text longer text

hasBLSComp