标签的widthProperty何时更新?

时间:2018-09-20 14:50:59

标签: java javafx

我使用Pane通过将某些Label添加到其子级列表来打印它们。由于某种原因,我需要绑定标签宽度,但是当我做类似的事情时:

public class LabelTestApp extends Application
{
    private Pane root = new Pane();
    private Label myLabel = new Label("test");

    public static void main(String[] args)
    {
        launch(args);
    }

    @Override
    public void start(Stage stage)
    {
        root.getChildren.add(myLabel);
        System.out.println(myLabel.widthProperty());
        stage.setScene(new Scene(root, 500, 500);
        stage.show();
     }
}

Label似乎没有更新其宽度。当我用:

打印时
System.out.println(myLabel.widthProperty());

我明白了:

ReadOnlyDoubleProperty [bean : Label@xxxxxxxx[styleClass = label]'test', name:width, value: 0.0]

所以我想,Label的宽度是在Layout期间计算的,并且由于Pane没有任何Layout Manager,因此永远不会计算出来,对吗?

如果是这样,我应该如何获得这个宽度?

否则,问题出在其他地方,我不知道在哪里。

有关信息:我需要使用窗格来绘制一些Shape,并控制它们的位置。标签的目的是在形状上打印一些信息。我需要标签的宽度,因为它们在形状上有些Line,并且我不希望它们越过标签。

请随时询问更多信息。

1 个答案:

答案 0 :(得分:0)

JavaFX仅列出可见的组件。

如果尝试这样的操作,您会看到以下内容:

final Label myLabel = new Label("test");
final Pane myPane = new Pane(myLabel);

System.out.println(myLabel.getWidth());

stage.setScene(new Scene(myPane, 640, 480));
stage.show();

System.out.println(myLabel.getWidth());

可打印

0.0
19.5

如您在此处看到的,直到调用stage.show()才设置标签的大小。您还可以覆盖Pane来查看layoutChildren()的首次调用。

作为旁注,如果您想找出某些文本的宽度而不在舞台上显示它,可以制作一个Text节点(代替标签)并获取其首选宽度,例如

new Text("test").prefWidth(0)

希望这会有所帮助!