【发布时间】:2019-06-28 18:57:17
【问题描述】:
在我的 JavaFX 应用程序中,用户登录并且应用程序检索有关用户的数据。一项数据是他们的公司名称。应用程序必须调整文本以保持Label 的宽度。
我有一个textProperty() 侦听器,它可以在Label 中调整TextField 的字体大小。宽度功能有效。无论公司名称的长度如何,它都适合。但是,较小的文本会挤得更靠近Label 的 y 坐标,如下所示:
加边框是为了强调。顶部是它适合宽度时的样子。底部正确调整字体大小,但不会相应调整 y 坐标。
所以,我有两个想法,我也不知道怎么做。
- 想办法让
setLayoutY()设置Label的垂直中心,而不是Label的顶部,以保持垂直居中而不管大小。 - 使用
setLayoutY()根据新字体大小调整Label的y坐标。这里的问题是我不知道如何获得我的文本的宽度之前我显示它,所以在我下面的代码中,labelHeight与labelHeight相同,默认字体为尚未申请。
// 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