`
shendixiong
  • 浏览: 393079 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

javaswing jtextpane 英文中文自动换行

    博客分类:
  • java
阅读更多

最近一段时间在做一个类似QQ聊天的工具。但是在其中遇到一个问题。

在做气泡聊天的时候,原本已经用Jtextarea已经实现。后来因为使用到emoji表情,需要将组件改为JtextPane来

实现插入图片,改组件后出现了这样的问题

 

1:使用jtextpane的时候当输入的全部都是英文和数字的时候是不会自动换行。只有中文的时候才会

 

当出现这样的问题后上网搜索到的解决方案是:

textField.setEditorKit(new HTMLEditorKit() {
			private static final long serialVersionUID = 3632670469611941371L;

			@Override
			public ViewFactory getViewFactory() {

				return new HTMLFactory() {
					public View create(Element e) {
						View v = super.create(e);
						if (v instanceof InlineView) {
							return new InlineView(e) {
								public int getBreakWeight(int axis, float pos, float len) {
									return GoodBreakWeight;
								}

								public View breakView(int axis, int p0, float pos, float len) {
									if (axis == View.X_AXIS) {
										checkPainter();
										int p1 = getGlyphPainter().getBoundedPosition(this, p0, pos, len);
										if (p0 == getStartOffset() && p1 == getEndOffset()) {
											return this;
										}
										return createFragment(p0, p1);
									}
									return this;
								}
							};
						} else if (v instanceof ParagraphView) {
							return new ParagraphView(e) {
								protected SizeRequirements calculateMinorAxisRequirements(int axis,
										SizeRequirements r) {
									if (r == null) {
										r = new SizeRequirements();
									}
									float pref = layoutPool.getPreferredSpan(axis);
									float min = layoutPool.getMinimumSpan(axis);
									r.minimum = (int) min;
									r.preferred = Math.max(r.minimum, (int) pref);
									r.maximum = Integer.MAX_VALUE;
									return r;
								}

							};
						}
						return v;
					}
				};
			}
		});

虽然按照上面的方式能解决换行问题。但是会出现如下问题:

1:当别人发送\n换行的时候,接收不会自动换行

2:获取方式不能直接通过gettext获取,获取的只是一段html代码。(可通过jtextpane.getdocument.gettext(0,jtextpane.getdocument.length()) 获取)

 

通过上面的方法达到想要的效果,后来在别人博客中看到一段代码:

 

    import javax.swing.JTextPane;  
    import javax.swing.text.AbstractDocument;  
    import javax.swing.text.BoxView;  
    import javax.swing.text.ComponentView;  
    import javax.swing.text.Element;  
    import javax.swing.text.IconView;  
    import javax.swing.text.LabelView;  
    import javax.swing.text.ParagraphView;  
    import javax.swing.text.StyleConstants;  
    import javax.swing.text.StyledEditorKit;  
    import javax.swing.text.View;  
    import javax.swing.text.ViewFactory;  
      
    /** 
     * 该类是真正实现超长单词都能自动换行的 JTextPane 的子类 
     * Java 7 以下版本的 JTextPane 本身都能实现自动换行,对 
     * 超长单词都能有效,但从 Java 7 开始读超长单词就不能自动 
     * 换行,导致 JTextPane 的实际宽度变大,使得滚动条出现。 
     * 下面的方法是对这个 bug 的较好修复。 
     * 
     * Created by dolphin on 15-2-3. 
     */  
    public class JIMSendTextPane extends JTextPane {  
      
        // 内部类  
        // 以下内部类全都用于实现自动强制折行  
      
        private class WarpEditorKit extends StyledEditorKit {  
      
            private ViewFactory defaultFactory = new WarpColumnFactory();  
      
            @Override  
            public ViewFactory getViewFactory() {  
                return defaultFactory;  
            }  
        }  
      
        private class WarpColumnFactory implements ViewFactory {  
      
            public View create(Element elem) {  
                String kind = elem.getName();  
                if (kind != null) {  
                    if (kind.equals(AbstractDocument.ContentElementName)) {  
                        return new WarpLabelView(elem);  
                    } else if (kind.equals(AbstractDocument.ParagraphElementName)) {  
                        return new ParagraphView(elem);  
                    } else if (kind.equals(AbstractDocument.SectionElementName)) {  
                        return new BoxView(elem, View.Y_AXIS);  
                    } else if (kind.equals(StyleConstants.ComponentElementName)) {  
                        return new ComponentView(elem);  
                    } else if (kind.equals(StyleConstants.IconElementName)) {  
                        return new IconView(elem);  
                    }  
                }  
      
                // default to text display  
                return new LabelView(elem);  
            }  
        }  
      
        private class WarpLabelView extends LabelView {  
      
            public WarpLabelView(Element elem) {  
                super(elem);  
            }  
      
            @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);  
                }  
            }  
        }  
      
        // 本类  
      
        // 构造函数  
        public JIMSendTextPane() {  
            super();  
            this.setEditorKit(new WarpEditorKit());  
        }  
    }  

 代码来源:http://www.iteye.com/topic/1138181

 

可解决英文和数字不自动换行问题

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics