您的位置:首页 > 编程语言 > Java开发

解决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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐