2010-04-26 6 views
1

У меня есть JLabel, который должен отображать текст в формате HTML. Тем не менее, я хочу ограничить это длиной 4 строки (и если да, дайте кнопку, чтобы увидеть все).Ограничить количество строк в html JLabel

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

Редактировать: Чтобы добавить немного более подробную информацию, мне нужно принудительно выполнить 4 строки, даже если вы правильно относитесь к обертке линий, изменяете размеры компонентов и изменяете размеры шрифтов. Я рассмотрел возможность изменения размера/изменения шрифтов, заменив метку на новую, которая подходит правильно.

JLabel кажется обрабатывать неполные теги хорошо, так что я мог бы сделать что-то вроде бинарного поиска на входной строки вывода, какой символ будет заставить ее перейти к пределу 4 линии (с помощью FontMetric, чтобы определить, сколько пикселей 4 строки будет be), а затем заменить существующую метку на новую. Большой недостаток этого подхода заключается в том, что мне нужно запускать вычисления каждый раз, когда пользователь меняет размер панели или меняет шрифты (и это похоже на грязный грязный хак).

ответ

2

Добавьте JLabel к JScrollPane, как установить ScrollPane с разумный предпочтительный размер е. Полосы прокрутки появятся обязательно.

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

Даже если вы использовали компонент ComponentListener для обработки события componentResized(), я не уверен, что вы можете найти разумный алгоритм для вычисления точной ширины/высоты отображения в 4 строки.

1

Я бы попробовать запустить через строку текста и удаления весь текст после третьего «\ п»

String shortenText(String oldtext){ 
     String newText = ""; 
     for(int i=0;i<3;i++){ 
      newText += oldtext.substring(0,oldtext.indexOf("\n"));//adds one line to String 
      oldtext = oldtext.substring(indexOf("\n")+1);//shorten old string to prepare for next iteration 
     } 


    return newText; 
} 

Вы также можете захотеть попробовать тот же алгоритм, за исключением полосы <p> и <br> тегов, а также ...

Если вы знаете значение возможных тегов просто переключить текст из «\ п» к «<br>» или любому тегу вам нужны

+0

HTML не использует «\ n» для новых строк, он использует тег
. – camickr

+0

Я только понял, что после публикации и исправления, спасибо, хотя –

+0

Это нормально, если единственный случай, который вас беспокоит, это перерывы, абзацы, элементы списка и т. Д. Однако JLabel также отлично справляется с переносом строк. Поэтому, если заданная строка ввода содержит слишком много символов, ярлык переносит их на следующую строку. (Обертка строк важна для моих целей, так как пользователь может изменить размер панели, создавая метку на произвольные размеры, и она должна по-прежнему ограничивать до 4 строк.) – Mike

0

Эй, я нашел способ, который работает. Рамка, с которой я работаю, позволяет мне создать прослушиватель для изменения размера шрифта. В этом слушателе я определяю, какой новый максимальный размер метки (getFontMetrics(font).getHeight() * 4), а затем переустановите максимальную высоту на ярлыке на это, а затем передайте все. Это даже отлично справляется с переносом слов. Я предполагаю, что кто-то может делать неприятные вещи с глупым входом в HTML, но это довольно хорошо относится к делу на 99%.

+0

Чтобы уточнить, я был бы очень удивлен, если бы кто-нибудь из моих пользователей введет что-нибудь, кроме простого жирного/курсива/подчеркивания. Может быть, список или разрыв отдельных строк, но теги шрифтов и т. Д. - это то, о чем я не беспокоюсь, пока у кого-нибудь не появится реальный вариант использования для одного. – Mike