解决Java7下JTextPane不能自动换行的问题

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());
	}
}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值