18

在 Java 中,当 JLabel 的文本由于空间不足而无法显示时,文本将被截断并在最后添加“...”。

如何轻松确定当前 JLabel 显示的是全文还是截断的文本?


编辑:

我看到有一种方法可以通过使用来找出文本的大小FontMetrics。然而,这个解决方案并没有完全回答这个问题。在 JLabel 的文本包含 HTML 装饰的情况下,metrics.stringWidth()也会计算 HTML 标记的宽度。因此,结果metrics.stringWidth()可能会大于 JLabel 的宽度,但仍会正确显示文本。

有没有办法知道在显示文本时 JLabel 本身做出了什么决定。它是否决定截断文本。

4

6 回答 6

8

省略号由标签的 UI 委托(通常是 的子类)添加BasicLabelUI,作为其布局和首选大小计算的一部分。layoutCL()可以覆盖该方法以检查几何,如本示例所示。

实际上,我会忽略省略并在工具提示中显示全文。

于 2011-11-01T22:38:03.023 回答
7

来自 Oracle -测量文本

// get metrics from the graphics
FontMetrics metrics = graphics.getFontMetrics(font);
// get the height of a line of text in this font and render context
int hgt = metrics.getHeight();
// get the advance of my text in this font and render context
int adv = metrics.stringWidth(text);
// calculate the size of a box to hold the text with some padding.
Dimension size = new Dimension(adv+2, hgt+2);

比较; size_JLabel.getSize()

于 2011-11-01T18:43:12.847 回答
5

我想如果组件的首选大小大于它的实际大小,那么你可以期待截断。当然,为了使其工作,组件必须已经实现

于 2011-11-01T18:46:14.353 回答
3

检查这个并查看layoutCompoundLabel()方法。它返回一个表示标签文本的字符串。您可以将其与原件进行比较以确定是否会被剪裁。

吉姆·S。

于 2011-11-01T20:55:12.483 回答
1

执行此操作的常用方法是使用一种方法来计算文本的预期大小,因为它将显示在标签中。如果您使用的是等宽字体,这很容易:

lengthOfChar * numChars

如果您不使用等宽字体,那显然要困难得多。我认为周围有一些实用程序会尝试计算这一点。

获得显示字符串的大小后,您可以与 JLabel 的长度进行比较,看看标签是否太小。

于 2011-11-01T18:44:50.640 回答
0

要获取 html 文本的大小,请检查此https://www.java.net/node/665691

View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString());
int width = (int) view.getPreferredSpan(View.X_AXIS);
int height = (int) view.getPreferredSpan(View.Y_AXIS);

唯一的小问题是它可能有非 html 文本的问题。因此,只需对非 html 字符串使用字体度量即可。以下对我来说非常有效:

if (value.toString().startsWith("<html>")) {
   View view = (View) javax.swing.plaf.basic.BasicHTML.createHTMLView(label, value.toString());
   width = (int) view.getPreferredSpan(View.X_AXIS);
} 
else {
   width =  (int) label.getFontMetrics(label.getFont()).stringWidth(value.toString());
}
于 2014-02-16T16:16:32.983 回答