JTextPane не будет отображать текст, добавленный DefaultStyledDocument - PullRequest
0 голосов
/ 03 мая 2018

Хорошо, у меня следующая проблема, я пишу простой графический клиент чата с Java Swing Framework. Для отображения полученных сообщений я использую JTextPane. У меня была проблема, что когда один пользователь отправляет сообщение из одного символа без пробелов, компонент JTextPane не переносит строку. Я решил эту проблему с помощью следующего кода: теперь компонент JTextPane не переносится только по границам слов, а также по любому символу, если длина не соответствует ширине компонента.

public class WrapEditorKit extends StyledEditorKit
{
    ViewFactory defaultFactory;

    public WrapEditorKit()
    {
        this.defaultFactory = new WrapColumnFactory();
    }

    public ViewFactory getViewFactory()
    {
        return this.defaultFactory;
    }

}

class WrapLabelView extends LabelView
{
    public WrapLabelView(Element element)
    {
        super(element);
    }

    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);
            }
        }
    }
}

class WrapColumnFactory implements ViewFactory
{
    public View create(Element element)
    {
        String kind = element.getName();

        if(null != kind)
        {
            if(kind.equals(AbstractDocument.ContentElementName))
            {
                return new WrapLabelView(element);
            }
            else if(kind.equals(AbstractDocument.ParagraphElementName))
            {
                return new ParagraphView(element);
            }
            else if(kind.equals(AbstractDocument.SectionElementName))
            {
                return new BoxView(element, View.Y_AXIS);
            }
            else if(kind.equals(StyleConstants.ComponentElementName))
            {
                return new ComponentView(element);
            }
            else if(kind.equals(StyleConstants.IconElementName))
            {
                return new IconView(element);
            }
        }

        return new LabelView(element);
    }
}

Я давно получил этот код с веб-страницы, у меня нет URL, он отлично работает для небольшой панели редактирования текста. Но когда я добавляю текст поверх Document, как указано выше, он ничего не отображает, он работает, только если я набираю слова непосредственно на панели, но не когда я добавляю текст поверх метода класса Document ...

StyleContext msgPaneStyle = new StyleContext();
final DefaultStyledDocument msgPaneDocument = new DefaultStyledDocument(this.msgPaneStyle);
JTextPane msgPane = new JTextPane(msgPaneDocument);
msgPane.setEditorKit(new WrapEditorKit());

Если я добавлю текст сейчас, набрав ..

msgPaneDocument.insertString(msgPaneDocument.getLength(), text, null);

... это не работает (не отображает текст), без комплекта редактора это работает. Есть идеи или подсказки?

EDIT

Мне кажется, проблема в том, что мои пользовательские EditorKit и StyledDocument не работают одновременно ... Если я вставлю текст, набрав msgPane.setText(text), это сработает!

1 Ответ

0 голосов
/ 03 мая 2018

Я решил / предотвратил эту проблему сам. Когда я использую ...

JTextPane msgPane = new JTextPane();
msgPane.setEditorKit(new WrapEditorKit());

msgPane.getDocument().insertString(msgPane.getDocument().getLength(), text, null);

... это работает, также с выделением отдельных слов! На этот раз я не добавляю пользовательский DefaultStyledDocument, вместо этого я использовал Document, возвращаемый msgPane.getDocument(), и теперь он работает.

Если есть какие-либо другие решения, особенно с использованием пользовательского DefaultStyledDocument или каких-либо объяснений по этому вопросу, я был бы рад ...

...