解决Java7下JTextPane不能自动换行的问题
2016-09-07 14:53
567 查看
Java7自带的JTextPane存在一个问题。我们知道默认情况下,如果JTextPane所在的JScrollPane禁止水平滚动条出现时,JTextPane是具备基于单词(Word)为最小单位的自动换行功能的。对于中文而言,最小单位就是一个汉字;对于英文或拉丁语言而言,就是以空格为单位的字母组合。但是有一个情况,如果你一直输入英文字母,中间不空格,那么JTextPane就会认为这是一个很长的单词,一直没有结束,那么它是不会自动换行的。这显然是不符合我们要求的。为了能够一劳永逸地解决这个问题,使JTextPane能够在任何情况下都能对超出宽度的内容进行自动换行,就需要对JTextPane进行派生子类定义,对其内部负责换行的地方做些修改。具体代码如下:
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 的较好修复。 * * */ 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()); } }
相关文章推荐
- 哪些年遇到过的Andriod问题(9)R.java文件不能自动生成解决方法
- 解决长串英文字母显示不能自动换行的问题和td中汉字自动换行 && CSS强制不换行
- 解决table不能换行的问题与CSS之自动换行总结
- java中org.xml.sax不能读取xml回车换行的问题解决(android)
- 【转】解决长串英文字母显示不能自动换行的问题和td中汉字自动换行 && CSS强制不换行
- 解决Android的TextView不能自动换行的问题
- 解决浏览器显示长数字不能自动换行或长字母不能换行的问题
- 解决浏览器显示长数字不能自动换行或长字母不能换行的问题
- android 典型问题:R.java文件不能自动生成的解决办法
- 解决页面表格中长英文字符串不能自动换行的问题
- 解决长串英文字母显示不能自动换行的问题(转)
- android 典型问题:R.java文件不能自动生成的解决办法
- 自定义viewgroup实现自动换行的布局,同时解决自定义布局在wrapcontent下高度不能自适应的问题,plus一些关于Component重写的基础知识
- (转)解决长串不能自动换行的问题和td中汉字自动换行 && CSS强制不换行
- 解决浏览器显示长数字不能自动换行或长字母不能换行的问题
- 解决长串英文字母显示不能自动换行的问题
- android 典型问题:R.java文件不能自动生成的解决办法
- 解决 IE Firefox下 字符串不能自动换行(折行)问题
- android 典型问题:R.java文件不能自动生成的解决办法
- Android 解决TableRow中TextView或Edittext超出屏幕,不能自动换行或换行问题