JTextPane不会显示由DefaultStyledDocument

时间:2018-05-03 10:12:09

标签: java swing jtextpane

好的,我遇到了以下问题,我用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);
    }
}

我从网页上获得了很长时间的代码,我没有任何网址,我认为它适用于小型文本编辑面板。但是当我在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);

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

修改

我认为问题在于,我的自定义EditorKitStyledDocument不能同时工作......如果我通过输入msgPane.setText(text)来插入文字就行了!

1 个答案:

答案 0 :(得分:0)

我自己解决/阻止了这个问题。当我在使用...时

export function loginUser(email,password){
  return dispatch=>{
   return new Promise((resolve, reject) => {
      axios.post('auth/login', {email,password})
      .then(res=>{
        if(res.status===200 && res.data.status===1){
          resolve(res.data.data)
          //things are working here
          dispatch({
            type: AUTH_SUCCESS,
            payload: res.data.data
          })
        }
        reject(res.status)
      })
      .catch(res => { 
        reject(res);
        dispatch(errorMsg(res.data.msg))
      })
    })
  }
}

......它有效,也突出了单个单词!我这次没有添加自定义JTextPane msgPane = new JTextPane(); msgPane.setEditorKit(new WrapEditorKit()); msgPane.getDocument().insertString(msgPane.getDocument().getLength(), text, null); ,而是使用DefaultStyledDocument返回的Document,现在可以使用了。{/ p>

如果有任何其他解决方案,特别是使用自定义msgPane.getDocument()或此问题的任何解释,我会很高兴...