在Java中,当JLabel的文本由于缺乏空间而无法显示时,文本将被截断并在末尾添加"…"。
我怎么能很容易地发现如果当前JLabel显示全文或截断?
编辑:
我看到有一种方法可以通过使用FontMetrics
来找出文本的大小。然而,这个解决方案并没有完全回答这个问题。在JLabel的文本包含HTML装饰的情况下,metrics.stringWidth()
也会计算HTML标签的宽度。因此,metrics.stringWidth()
的结果可能会大于JLabel的宽度,但仍然可以正确显示文本。
是否有一种方法知道在显示文本时JLabel本身采取了什么决定。是否决定截断文本
省略号是由标签的UI委托添加的,通常是BasicLabelUI
的子类,作为其布局和首选大小计算的一部分。方法layoutCL()
可以被重写以检查几何图形,如本例所示。
作为一个实际问题,我会忽略省略并在工具提示中显示全文。
From Oracle - measurement 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);
比较size
和JLabel.getSize()
的大小
我想如果组件的首选大小大于它的实际大小,那么您可以期望截断。当然,为了使其工作,组件必须已经实现。
检查这个并查看layoutCompoundLabel()
方法。它返回一个表示标签文本的String。您可以将它与原始文件进行比较,以确定它是否将被剪切。
通常的方法是使用一个方法来计算将在标签中显示的文本的预期大小。如果你使用的是等宽字体,这很简单:
lengthOfChar * numChars
如果你没有使用等宽字体,这显然要困难得多。我认为有一些实用程序会尝试计算这个。
一旦有了显示字符串的大小,就可以与JLabel的长度进行比较,看看标签是否太小了。
要获取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());
}