最近一段时间在做一个类似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
可解决英文和数字不自动换行问题