Узнать, превышает ли текст JLabel размер метки
В Java, когда текст JLabel не может быть отображен из-за нехватки места, текст усекается и в конце добавляется "...".
Как я могу легко узнать, отображается ли в настоящее время JLabel полный текст или усеченный?
EDIT:
Я вижу, что есть способ узнать размер текста, используя FontMetrics
. Однако это решение не полностью отвечает на вопрос. В случае, если в тексте JLabel содержатся декорации HTML, metrics.stringWidth()
также вычисляет ширину HTML-тегов. Таким образом, может произойти, что результат metrics.stringWidth()
будет больше, чем ширина JLabel, но текст будет отображаться правильно.
Есть ли способ узнать, какое решение принял сам JLabel при отображении текста. Он решил обрезать текст или нет.
Ответы
Ответ 1
Эллипсис добавляется делегатом UI метки, обычно подклассом BasicLabelUI
, как часть его компоновки и предпочтительного расчета размера, Метод layoutCL()
может быть переопределен для изучения геометрии, как показано на примере .
Как практический вопрос, я проигнорировал бы элицию и покажу полный текст в подсказке инструмента.
Ответ 2
От 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()
;
Ответ 3
Я полагаю, если размер предпочтительного компонента больше фактического размера, тогда вы можете ожидать усечения. Для этого, конечно, компонент должен быть реализован.
Ответ 4
Отметьте этот и см. метод layoutCompoundLabel()
. Он возвращает строку, представляющую текст метки. Вы можете сравнить его с оригиналом, чтобы определить, будет ли он обрезаться.
Джим С.
Ответ 5
Обычный способ сделать это - использовать метод, который вычисляет ожидаемый размер текста, поскольку он будет отображаться на этикетке. Если вы используете моноширинный шрифт, это легко:
lengthOfChar * numChars
Если вы не используете моноширинный шрифт, это, очевидно, намного сложнее. Я думаю, что есть некоторые утилиты, которые будут пытаться вычислить это.
Как только размер строки отображается, вы можете сравнить с длиной JLabel и посмотреть, слишком ли мал ярлык.
Ответ 6
Чтобы получить размеры 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());
}