测试标签溢出

javafx-2 javafx

1299 观看

3回复

103 作者的声誉

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

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

作者: SwR 的来源 发布者: 2013 年 7 月 12 日

回应 (3)


4

2000 作者的声誉

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

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

如果你使用这个皮肤标签,你应该能够检测你的文字是否是椭圆形的。如果你想知道循环和反射:Java不允许我通过其他方式访问文本字段,所以这可能是一个强烈的指示,你真的不应该这样做;-)尽管如此:它的工作原理!

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

作者: Jan Gassen 发布者: 19.12.2014 04:13

1

11 作者的声誉

minisu在这个答案中发布了一种检测超限的方法:https://stackoverflow.com/a/15178908/9492864

这种方式适用于所有标记的,我在使用JavaFX 8的Buttons上测试它。您可以将一个监听器添加到needsLayoutProperty:

labeled.needsLayoutProperty().addListener((observable, oldValue, newValue) -> {
   String originalString = labeled.getText();
   Text textNode = (Text) labeled.lookup(".text"); // "text" is the style class of Text
   String actualString = textNode.getText();

   boolean clipped = !actualString.isEmpty() && !originalString.equals(actualString);

   System.out.println("is " + originalString + " clipped: " + clipped);
});
作者: Johann Alfred Verdant Anderson 发布者: 08.06.2018 08:25

0

83 作者的声誉

这项工作对我来说!! 在javafx

public class LabelHelper{
  public static boolean necesitaTooltip(Font font, Label label){
    Text text = new Text(label.getText());
    text.setFont(font);
    Bounds tb = text.getBoundsInLocal();
    Rectangle stencil = new Rectangle(
            tb.getMinX(), tb.getMinY(), tb.getWidth(), tb.getHeight()
    );

    Shape intersection = Shape.intersect(text, stencil);

    Bounds ib = intersection.getBoundsInLocal();
    return ib.getWidth() > label.getPrefWidth();
  }

  public static void asignarTexto(Label label, String texto){
      label.setText(texto);
      if (necesitaTooltip(label.getFont(), label)){
          Tooltip tp = new Tooltip(texto);

        label.setTooltip(tp);
      }
  }
} 

仅为设置文本调用asignarTexto(label,texto)标签并检查文本是否在标签中溢出,然后为标签添加工具提示。

作者: tovaz 发布者: 25.03.2019 07:08
32x32