【问题标题】:JavaFX: How to get width of label before displaying?JavaFX:如何在显示前获取标签的宽度?
【发布时间】:2019-06-28 18:57:17
【问题描述】:

在我的 JavaFX 应用程序中,用户登录并且应用程序检索有关用户的数据。一项数据是他们的公司名称。应用程序必须调整文本以保持Label 的宽度。

我有一个textProperty() 侦听器,它可以在Label 中调整TextField 的字体大小。宽度功能有效。无论公司名称的长度如何,它都适合。但是,较小的文本会挤得更靠近Label 的 y 坐标,如下所示:

加边框是为了强调。顶部是它适合宽度时的样子。底部正确调整字体大小,但不会相应调整 y 坐标。

所以,我有两个想法,我也不知道怎么做。

  • 想办法让setLayoutY() 设置Label 的垂直中心,而不是Label 的顶部,以保持垂直居中而不管大小。
  • 使用setLayoutY()根据新字体大小调整Label的y坐标。这里的问题是我不知道如何获得我的文本的宽度之前我显示它,所以在我下面的代码中,labelHeightlabelHeight 相同,默认字体为尚未申请。
// Resizes text to fit name lengths
companyNameLabel.textProperty().addListener((observable, oldValue, newValue) -> {

    Text tmpText = new Text(newValue);
    tmpText.setFont(Font.font("Oxygen", 72));

    double textWidth = tmpText.getLayoutBounds().getWidth();

    // Check if text width is greater than maximum width
    if (textWidth > 470) {

        // Change font size to fit within 470
        double newFontSize = 72 * 470 / textWidth;
        companyNameLabel.setFont(Font.font("Oxygen", newFontSize));

        // Finds y value for vertical centering
        double labelHeight = companyNameLabel.getHeight();
        System.out.println(labelHeight);
        companyNameLabel.setLayoutY(155 - labelHeight / 2);

    }
});

谢谢。

【问题讨论】:

  • 我可能错了,但是使用Text 节点,您可以先将其添加到不可见的虚拟窗格中以获取宽度。之后,你就可以做你需要做的了。
  • 您发布的链接似乎是我想要的,但我无法理解它。它实际上有一个public static final TextBoundsType LOGICAL_VERTICAL_CENTER,“通常用于在其父级范围内垂直居中文本节点。”但是,我不确定我如何使用它。它并没有真正给出例子。我不确定如何设置常量以及如何将其应用于Label(或Text)。谢谢。

标签: user-interface javafx label


【解决方案1】:

我怀疑其他人也犯了同样的错误。我之前曾尝试将定位更改为CENTER_LEFT,但它对我不起作用,因为我将高度设置为自动计算高度。如果你有一个设定的高度,这会很好。我已经得出结论,我一定是脑死了。

【讨论】:

    猜你喜欢
    • 2016-10-31
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多