java - 标签的 widthProperty 何时更新?

标签 java javafx

我使用Pane通过将一些Label添加到其子列表中来打印它们。由于某种原因,我需要绑定(bind)标签宽度,但是当我执行以下操作时:

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]

所以我认为标签的宽度是在布局期间计算的,并且由于 Pane 没有任何布局管理器,因此永远不会计算它,对吗?

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

如果没有,问题出在其他地方,但我不知道出在哪里。

供引用:我需要使用 Pane 来绘制一些形状,并控制它们的位置。标签的目的是在形状上打印一些信息。我需要标签的宽度,因为它们是形状上的一些线,并且我不希望它们穿过标签。

请随时询问更多信息。

最佳答案

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)

希望这有帮助!

关于java - 标签的 widthProperty 何时更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52427916/

相关文章:

java - 运算符重载 STL 的性能损失是什么

java - JSF 生命周期(验证)

java - 从填充了 CheckMenuItems 的 MenuButton 访问信息 (JavaFX)

java - 具有固定 View y 轴 JavaFX 的滚动 Pane 折线图

java - 线程 "main"java.lang.ClassNotFoundException : sample. Main 中的异常 - 为什么?

java - Struts2文件上传错误

java - 文本内容中的 JAXB Moxy 元素

java - 如何在 Servlet 程序中获取正确的文件路径?

java - 如何在 JavaFX 堆积面积图上调整范围?

JavaFX 复选框不遵循绑定(bind)属性的值