在Java中,当由于空间不足而无法显示JLabel的文本时,文本被截断并且最后添加了“...”。
如何轻松找出当前JLabel是显示全文还是截断?
编辑:
我发现有一种方法可以使用FontMetrics
找出文本的大小。但是,此解决方案并未完全回答这个问题。在JLabel的文本包含HTML装饰的情况下,metrics.stringWidth()
也将计算HTML标签的宽度。因此,metrics.stringWidth()
的结果可能会比JLabel的宽度更大,但文本仍会正确显示。
有没有办法知道在显示文本时JLabel本身做出了什么决定。它是否决定截断文本。
答案 0 :(得分:8)
省略号由标签的UI委托添加,通常是BasicLabelUI
的子类,作为其布局和首选大小计算的一部分。可以覆盖方法layoutCL()
以检查几何体,如example所示。
实际上,我会忽略省略并在工具提示中显示全文。
答案 1 :(得分:6)
来自Oracle - 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);
将size
与JLabel.getSize()
;
答案 2 :(得分:4)
我想如果组件的首选大小大于它的实际大小,那么你可以期待截断。当然,要使其工作,组件必须已经实现。
答案 3 :(得分:3)
检查this并查看layoutCompoundLabel()
方法。它返回一个表示标签文本的String。您可以将其与原始文件进行比较,以确定是否会剪切它。
Jim S。
答案 4 :(得分:1)
通常的方法是使用一种方法来计算文本的预期大小,因为它将显示在标签中。如果您使用的是等宽字体,这很容易:
lengthOfChar * numChars
如果你没有使用等宽字体,那显然要困难得多。我认为有一些实用程序试图计算这个。
获得显示字符串的大小后,您可以与JLabel的长度进行比较,看看标签是否太小。
答案 5 :(得分: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());
}