测试标签溢出

SwR*_*SwR 9 javafx javafx-2

我有一个多行标签,其文字有可能超支.如果它这样做,我想减小字体大小,直到它没有超越,或直到它达到一些最小尺寸.这有望使标签改变大小,直到整个字符串可见.

我的问题是,我不知道如何测试以查看文本是否超限.我已经尝试过测试以查看标签的文本是否以椭圆字符串结尾,但我认为椭圆在技术上并未添加到标签的textProperty中.那么有谁知道测试这个的好方法?

Jan*_*sen 4

简短而令人失望的答案是:你根本无法以可靠的方式做到这一点。

稍微长一点的答案是,标签本身甚至不知道它是否溢出。每当调整标签大小时,外观类 ( 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());
  }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用此皮肤作为标签,您应该能够检测到您的文本是否是椭球体。如果您想知道循环和反射:Java 不允许我通过其他方式访问文本字段,因此这可能是一个强有力的指示,表明您确实不应该这样做;-) 尽管如此:它有效!

免责声明:我只检查过 JavaFX 8