JTextPane 不会显示由 DefaultStyledDocument 添加的文本

JTextPane won't display text added by DefaultStyledDocument

好的,我遇到了以下问题,我使用 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 [=36 的方法添加文本时它不起作用=]...

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

...它不起作用(不显示文本),没有编辑器工具包它就可以工作。有什么想法或提示吗?

编辑

我认为问题在于,我的自定义 EditorKitStyledDocument 不能同时工作...如果我通过键入 msgPane.setText(text) 插入文本,它就可以工作!

我自己solved/prevented这个问题。当我使用...

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

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

...有效,还可以突出显示单个单词!这次我没有添加自定义 DefaultStyledDocument,而是使用了 msgPane.getDocument() 返回的 Document,现在可以使用了。

如果有任何其他解决方案,特别是使用自定义 DefaultStyledDocument 或对此问题的任何解释,我将很高兴...