Включение переноса слов в JTextPane с помощью HTMLDocument

Везде я читал ответы людей, которые находили способы включить перенос слов в JTextPane, но ни один из них не работает для меня. Я использую HTMLDocument (для отображения контента "text/html"), и ничего из того, что я нашел до сих пор, не заставило его работать. JTextPane всегда вызывает горизонтальную прокрутку JScrollPane. Мне нужно, чтобы JTextPane можно было прокручивать, но только по вертикали.

У кого-нибудь есть работающая демонстрация переноса слов JTextPane, отображающего HTML-контент?


person Yanick Rochon    schedule 18.10.2011    source источник


Ответы (2)


Используйте это как пример для реализации пользовательской обертки (все, что вам нужно) http://java-sl.com/tip_html_letter_wrap.html

http://java-sl.com/wrap.html

person StanislavL    schedule 19.10.2011
comment
превосходно! первый работал. Я ранее пробовал второй без успеха. Спасибо! - person Yanick Rochon; 19.10.2011

Есть несколько дубликатов этого вопроса и много ответов, но ни один из тех, что я нашел, не имеет однокомпонентного решения проблемы. Этот класс основан на одном из решений Станислава аналогичной проблемы с переносом простого текста с некоторыми изменениями. Это решение протестировано с Java 1.7.0_55.

import javax.swing.text.Element;
import javax.swing.text.LabelView;
import javax.swing.text.StyleConstants;
import javax.swing.text.View;
import javax.swing.text.ViewFactory;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLEditorKit;

public class WrappedHtmlEditorKit extends HTMLEditorKit
{
    private static final long serialVersionUID = 1L;

    private ViewFactory viewFactory = null;

    public WrappedHtmlEditorKit()
    {
        super();
        this.viewFactory = new WrappedHtmlFactory();
        return;
    }

    @Override
    public ViewFactory getViewFactory()
    {
        return this.viewFactory;
    }

    private class WrappedHtmlFactory extends HTMLEditorKit.HTMLFactory
    {
        @Override
        public View create(Element elem)
        {
            View v = super.create(elem);

            if (v instanceof LabelView)
            {
                Object o = elem.getAttributes().getAttribute(StyleConstants.NameAttribute);

                if ((o instanceof HTML.Tag) && (o == HTML.Tag.BR))
                {
                    return v;
                }

                return new WrapLabelView(elem);
            }

            return v;
        }

        private class WrapLabelView extends LabelView
        {
            public WrapLabelView(Element elem)
            {
                super(elem);
                return;
            }

            @Override
            public float getMinimumSpan(int axis)
            {
                switch (axis)
                {
                    case View.X_AXIS:
                    {
                        return 0;
                    }
                    case View.Y_AXIS:
                    {
                        return super.getMinimumSpan(axis);
                    }
                    default:
                    {
                        throw new IllegalArgumentException("Invalid axis: " + axis);
                    }
                }
            }
        }
    }
}
person vallismortis    schedule 10.08.2015
comment
Это единственное решение, которое сработало для меня. Однако у меня были некоторые проблемы со спиной к спине (к спине, к спине) небольших изображений, не разделенных пробелами или словами. Например, длинная цепочка эмоций, между которыми ничего нет, по-прежнему страдает теми же симптомами проблемы с действительно длинными словами. Я снова прокомментирую, если найду простое исправление, которое вы можете отредактировать. - person gunfulker; 22.10.2015
comment
Большое спасибо. Я буквально несколько месяцев искал реализацию HTMLEditorKit для JTextPane, которая поддерживает перенос WORD, а не перенос LETTER. Раньше я использовал код StanislavL, который поддерживает только перенос букв, что выглядит ужасно. Однако, в отличие от кода StanislavL, ваша версия не выделяет и не подчеркивает гиперссылки. Вы знаете, как это исправить? Это очень помогло бы мне, так как я понятия не имею, как адаптировать/написать собственный HTMLEditorKit. - person trinity420; 27.12.2018
comment
@ trinity420 HTMLEditorKit поддерживает HTML версии 3.2 с некоторыми расширениями, поэтому вам необходимо придерживаться элементов стиля, которые были доступны тогда. Я рекомендую опубликовать новый вопрос и связать его здесь, потому что ответ будет слишком длинным для комментария. - person vallismortis; 27.12.2018