`
shendixiong
  • 浏览: 399460 次
  • 性别: 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

 

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

分享到:
评论

相关推荐

    控制jEditorPane和jTextPane换行的演示程序

    3. **监听事件**:可以添加`DocumentListener`到`JEditorPane`或`JTextPane`的`Document`上,监听文本的插入和删除事件,从而在合适的时候进行自动换行。 4. **使用布局管理器**:虽然文本组件的布局主要由`...

    Notepad.rar

    - **自动换行**:Java文本组件默认支持自动换行,当文本超出边界时,会自动换行显示。 3. **文件操作**: - **新建**:创建新的文本文件,使用`File`类和`BufferedWriter`类来创建并写入文件。 - **保存**:将...

    java记事本课程报告.doc

    此外,还应包含格式设置,如自动换行和字体选择,并且支持右键弹出菜单和快捷键操作。 2. **设计思路与技术选型**: - 使用Java Swing库来构建用户界面,包括JMenu用于创建菜单栏,JTextPane作为文本输入区域,...

    java做的多功能记事本

    除了基本的文本编辑功能,一个完整的多功能记事本可能还包括查找替换、撤销重做、拼写检查、自动换行、高亮显示代码等功能。这些功能的实现依赖于Java的事件监听机制、文本解析器和正则表达式等技术。 为了存储用户...

    一个用java编写的记事本小程序参照.pdf

    17. **JCheckBoxMenuItem**:`JCheckBoxMenuItem` 用于创建带有复选标记的菜单项,如 "自动换行"。 18. **事件处理**:通过 `addActionListener` 将事件处理器附加到菜单项,实现用户交互功能,如打开、保存、复制...

    虚拟的java编辑器课程设计报告样本.doc

    设计时借鉴了Windows记事本的功能,但根据课程设计的要求进行了简化,去除了自动换行、打印等高级功能。 2. 功能设计: - 主体模块:包括窗口、菜单和文本编辑区域,提供简洁直观的操作界面。 - 功能模块:涵盖了...

    java程序设计—文本编辑器

    文本编辑器还可能包含其他特性,如自动换行、撤销/重做操作、文本格式化等。这些功能的实现需要深入理解字符串操作、栈数据结构(用于实现撤销/重做)和样式设置等概念。 在实际开发过程中,良好的代码组织和设计...

    记事本 java编写

    7. **线程**:如果记事本包含实时保存或者自动换行等功能,可能需要用到多线程。Java中的Thread类或Runnable接口可以帮助实现。 8. **设计模式**:良好的软件设计通常会应用到设计模式,如单例模式(用于管理资源,...

    一个用java编写的记事本小程序参考.pdf

    - `JCheckBoxMenuItem`创建带有复选框的菜单项,如"自动换行"。 - `JTextArea`用于显示和编辑多行文本。 - `JTextPane`提供更复杂的文本格式化功能。 - `JScrollPane`用于包裹文本组件,添加滚动条。 6. **事件...

    虚拟的java编辑器课程设计报告.docx

    - **简化设计**:参考记事本的基本功能,去除了一些复杂特性,如自动换行和打印功能。 **2. 功能设计** - **主体模块**:利用`JFrame`类创建窗口,通过菜单条、菜单项等构建菜单系统。 - **功能模块**:实现文件的...

Global site tag (gtag.js) - Google Analytics