узнать, превышает ли текст JLabel размер этикетки - PullRequest
16 голосов
/ 01 ноября 2011

В Java, когда текст JLabel не может быть отображен из-за недостатка места, текст обрезается и в конце добавляется «...».

Как я могу легко узнать, отображает ли JLabel полный текст или усеченный?


EDIT:

Я вижу, что есть способ узнать размер текста, используя FontMetrics. Однако это решение не полностью отвечает на вопрос. В случае, если текст JLabel содержит HTML-декорации, metrics.stringWidth() также рассчитывает ширину HTML-тегов. Так что может получиться, что результат metrics.stringWidth() будет больше, чем ширина JLabel, но текст будет отображаться правильно.

Есть ли способ узнать, какое решение принял сам JLabel при отображении текста. Решил ли он урезать текст или нет.

Ответы [ 6 ]

8 голосов
/ 02 ноября 2011

Многоточие добавляется делегатом пользовательского интерфейса метки, как правило, подклассом BasicLabelUI, как часть его макета и расчета предпочтительного размера. Метод layoutCL() может быть переопределен для проверки геометрии, как показано в этом примере .

С практической точки зрения я бы проигнорировал это решение и показал бы полный текст в подсказке.

6 голосов
/ 01 ноября 2011

Из 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();

4 голосов
/ 01 ноября 2011

Полагаю, если предпочтительный размер компонента больше его фактического размера, вы можете ожидать усечения.Конечно, чтобы это работало, компонент уже должен быть реализован .

3 голосов
/ 02 ноября 2011

Проверьте это и посмотрите метод layoutCompoundLabel().Возвращает строку, представляющую текст метки.Вы можете сравнить его с оригиналом, чтобы определить, будет ли он вырезан.

Джим С.

1 голос
/ 01 ноября 2011

Обычный способ сделать это - использовать метод, который вычисляет ожидаемый размер текста, который будет отображаться в метке.Если вы используете моноширинный шрифт, это легко:

lengthOfChar * numChars

Если вы не используете моноширинный шрифт, это, очевидно, намного сложнее.Я думаю, что есть несколько утилит, которые будут пытаться вычислить это.

Когда у вас есть размер отображаемой строки, вы можете сравнить ее с длиной JLabel и посмотреть, не слишком ли метка слишком мала.

0 голосов
/ 16 февраля 2014

Чтобы узнать размеры 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());
}
...