2011-11-01 82 views
14

在Java中时的JLabel的文本无法显示,由于缺乏空间的文本被截断,“......”在最后。发现如果一个JLabel的文本超出标签尺寸

如何轻松找出当前JLabel是显示全文还是截断?


编辑:

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

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

回答

8

省略号由标签的UI委托加入,典型地a的BasicLabelUI亚类中,作为其一部分的布局和优选的尺寸计算。可以覆盖方法layoutCL()来检查几何图形,如example所示。

作为一个实际问题,我会忽略elision并在工具提示中显示全文。

+2

'在工具提示中显示全文。“这几乎是我想要做的。如果文本被截断以在工具提示中显示全文。 – jutky

+1

非常感谢。这是一个非常优雅的解决方案。 – jutky

+1

在工具提示上的良好通话,我现在正在使用它。 –

5

从甲骨文 - Measuring Text

// 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); 

比较sizeJLabel.getSize()的大小;

+0

如果我想确保所有的文本将显示标签(无中继线)?我怎么能保证,没有显式设置JXabel的大小setXXXSize? – Heisenbug

+0

听起来对我来说不可能。平凡地说,如果你有一个10像素宽的标签,文本是莎士比亚的完整作品,除非你改变JLabel的大小,否则会有一些截断。 – Kane

+0

@Heisenburg:你计算Oracle描述的文本大小,然后使用setPreferredSize方法设置JLabel。你必须找出JLabel的第四行中适当的填充常量。 –

1

通常的方式做到这一点是使用计算,因为它会在标签中显示的文本的预期大小的方法。如果您使用的是等宽字体,这很容易:

lengthOfChar * numChars 

如果您不使用等宽字体,显然要困难得多。我想有一些公用事业公司会试图计算这一点。

一旦你的显示字符串的大小,你可以比较的JLabel的长度,看看标签太小。

4

我想,如果组件的首选尺寸大于它的实际尺寸,那么你可以指望截断。为了这个工作,当然,该组件必须已经实现了。

+1

我不确定。如果我将首选大小设置为比完全显示文本所需的大,则可能是实际大小小于首选值,但文本仍未被截断。 – jutky

+0

@jutky,建议不要明确设置首选大小。这是你应该留给布局经理的东西。 – mre

+0

那么我应该如何限制组件的大小呢?我教导说这是首选尺寸。 – jutky

3

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

吉姆S.

+0

它看起来不错,但我从哪里得到viewR,iconR,textR变量的值? – jutky

+0

我传递了label.getBounds()为所有三个,它似乎工作正常。 –

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()); 
}