最近一段时间在做一个类似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
可解决英文和数字不自动换行问题
相关推荐
3. **监听事件**:可以添加`DocumentListener`到`JEditorPane`或`JTextPane`的`Document`上,监听文本的插入和删除事件,从而在合适的时候进行自动换行。 4. **使用布局管理器**:虽然文本组件的布局主要由`...
- **自动换行**:Java文本组件默认支持自动换行,当文本超出边界时,会自动换行显示。 3. **文件操作**: - **新建**:创建新的文本文件,使用`File`类和`BufferedWriter`类来创建并写入文件。 - **保存**:将...
此外,还应包含格式设置,如自动换行和字体选择,并且支持右键弹出菜单和快捷键操作。 2. **设计思路与技术选型**: - 使用Java Swing库来构建用户界面,包括JMenu用于创建菜单栏,JTextPane作为文本输入区域,...
除了基本的文本编辑功能,一个完整的多功能记事本可能还包括查找替换、撤销重做、拼写检查、自动换行、高亮显示代码等功能。这些功能的实现依赖于Java的事件监听机制、文本解析器和正则表达式等技术。 为了存储用户...
17. **JCheckBoxMenuItem**:`JCheckBoxMenuItem` 用于创建带有复选标记的菜单项,如 "自动换行"。 18. **事件处理**:通过 `addActionListener` 将事件处理器附加到菜单项,实现用户交互功能,如打开、保存、复制...
设计时借鉴了Windows记事本的功能,但根据课程设计的要求进行了简化,去除了自动换行、打印等高级功能。 2. 功能设计: - 主体模块:包括窗口、菜单和文本编辑区域,提供简洁直观的操作界面。 - 功能模块:涵盖了...
文本编辑器还可能包含其他特性,如自动换行、撤销/重做操作、文本格式化等。这些功能的实现需要深入理解字符串操作、栈数据结构(用于实现撤销/重做)和样式设置等概念。 在实际开发过程中,良好的代码组织和设计...
7. **线程**:如果记事本包含实时保存或者自动换行等功能,可能需要用到多线程。Java中的Thread类或Runnable接口可以帮助实现。 8. **设计模式**:良好的软件设计通常会应用到设计模式,如单例模式(用于管理资源,...
- `JCheckBoxMenuItem`创建带有复选框的菜单项,如"自动换行"。 - `JTextArea`用于显示和编辑多行文本。 - `JTextPane`提供更复杂的文本格式化功能。 - `JScrollPane`用于包裹文本组件,添加滚动条。 6. **事件...
- **简化设计**:参考记事本的基本功能,去除了一些复杂特性,如自动换行和打印功能。 **2. 功能设计** - **主体模块**:利用`JFrame`类创建窗口,通过菜单条、菜单项等构建菜单系统。 - **功能模块**:实现文件的...