我有一个多行标签,其文本有可能超出范围。如果是这样,我想减小字体大小,直到它不超出,或者直到它达到最小尺寸。这将有希望使标签将改变大小,直到整个字符串可见。检测标签溢出
我的问题,我不知道如何测试,看看文本是否超限。我试过测试标签的文本是否以椭圆字符串结尾,但我相信这个椭圆在技术上并没有添加到标签的textProperty中。那么是否有人知道测试此方法的好方法?
我有一个多行标签,其文本有可能超出范围。如果是这样,我想减小字体大小,直到它不超出,或者直到它达到最小尺寸。这将有希望使标签将改变大小,直到整个字符串可见。检测标签溢出
我的问题,我不知道如何测试,看看文本是否超限。我试过测试标签的文本是否以椭圆字符串结尾,但我相信这个椭圆在技术上并没有添加到标签的textProperty中。那么是否有人知道测试此方法的好方法?
简短和令人失望的答案:你根本无法以可靠的方式做到这一点。
稍微长一点的答案是,标签本身甚至不知道它是否飞越了。每当标签被调整大小时,皮肤类(LabeledSkinBase
)负责更新显示的文本。但是,该类使用JavaFX utils类来计算椭球文本。这里的问题是,如果标签的尺寸要求这样,那么相应的方法只返回一个椭圆体的字符串。皮肤本身从不知道文本是否实际上是椭圆形的,它只是将显示的文本更新为返回的结果。
你可以尝试的是检查皮肤类的显示文本,但它是受保护的。所以,你需要做的是细分LabelSkin
,并实施类似的东西:
package com.sun.javafx.scene.control.skin;
import java.lang.reflect.Field;
import javafx.scene.control.Label;
@SuppressWarnings("restriction")
public class TestLabel extends LabelSkin {
private LabeledText labelledText;
public TestLabel(Label label) throws Exception {
super(label);
for (Field field : LabeledSkinBase.class.getDeclaredFields()) {
if (field.getName().equals("text")) {
field.setAccessible(true);
labelledText = (LabeledText) field.get(this);
break;
}
}
}
public boolean isEllipsoided() {
return labelledText != null && labelledText.getText() != null && !getSkinnable().getText().equals(labelledText.getText());
}
}
如果您对您标签使用这个皮肤,你应该能够检测到您的文字是否ellipsoided。如果你想知道循环和反思:Java不允许我通过其他方式访问文本字段,所以这可能是一个强烈的指示器,你真的不应该这样做;-)尽管如此:它的工作原理!
免责声明:我只检查了JavaFX的8
跳车,我想知道这个问题,以及... – Warkst
检查也是这个http://stackoverflow.com/a/35065526 –