Ограничить количество строк в HTML JLabel - PullRequest
1 голос
/ 26 апреля 2010

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 апреля 2010

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

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

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

1 голос
/ 26 апреля 2010

Я бы попробовал запустить строку текста и удалить весь текст после третьего "\ n"

    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> ...

Если вам известны значения возможных тегов, просто переключите текст с "\ n" на "<br>" или любой нужный вам тег

0 голосов
/ 26 апреля 2010

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

...