Компонент Swing с автоматическим переносом строк и ограниченной шириной с поддержкой HTML

Я хочу реализовать небольшую всплывающую подсказку с полосой прокрутки, как в eclipse, которая появляется при наведении курсора на класс или член.

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

Также нигде нельзя найти способ ограничить только ширину, поскольку для каждого «setXSize», где X «предпочтительно», «максимум», «минимум» и т. д., все требуют двух аргументов, и для компонентов нет метода «setMaxWidth».

Установка "setMaximumSize(new Dimension(256, Integer.MAX_VALUE));" может показаться решением, но она не работает, так как параметры, заданные "max" и "min", большую часть времени игнорируются, что довольно неприятно.

По запросу актуальный пример реализации:

public class MyTooltip extends JTooltip{
    private JScrollPane scroll;
    private JEditorPane pane;

    public MyTooltip(String htmlCode){
       this.pane = new JEditorPane();
       this.scroll = new JScrollPane(this.pane);
       this.pane.setEditable(false);
       this.pane.setContentType("text/html");
       this.scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);

       //Here the problems begin
       this.pane.setMaximumSize(new Dimension(512, Integer.MAX_VALUE));
       this.scroll.setMaximumSize(new Dimension(512, Integer.MAX_VALUE));
       this.pane.setText(htmlCode);

       this.add(scroll);
    }
}
  • фактический код немного сложнее. но я думаю, что это хорошее приближение...

person salbeira    schedule 14.03.2013    source источник
comment
Добавлено правкой. Текст отображается, но когда какая-либо строка фрагмента HTML слишком длинная, я не получаю разрыва строки, но текст просто продолжает выходить за пределы области просмотра, а также перекрывает сам вид, выравнивая вид по центру отображаемого текста - наличие текста, покрывающего слишком большую часть соответствующих частей, которые не превышают максимальную ширину, которую я хочу иметь   -  person salbeira    schedule 14.03.2013
comment
Не устанавливайте максимальный/предварительный/минимальный размер панели.   -  person StanislavL    schedule 14.03.2013


Ответы (2)


Пробовали ли вы JTextPane с HTMLEditorKit (текстовый/html тип контента)?

Я думаю, это то, что вам нужно.

person StanislavL    schedule 14.03.2013

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

Чтобы позволить HTML отображать это так, как предполагалось, мы заменили каждый «пробел» на & nbsp;, чтобы не выполнялась оптимизация пробелов между символами, но это, конечно, приводит к тому, что ни один алгоритм автоматического переноса строк не принимает любой «пробел» между словами как подходящее место для разрыва линии.

Таким образом, наша реализация на самом деле работает так, как задумано, только строки, которые мы отображаем во всплывающей подсказке, не подходят для разрыва строки.

person salbeira    schedule 14.03.2013