1. 程式人生 > >解決Java7下JTextPane不能自動換行的問題

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


相關推薦

解決Java7JTextPane不能自動的問題

Java7自帶的JTextPane存在一個問題。我們知道預設情況下,如果JTextPane所在的JScrollPane禁止水平滾動條出現時,JTextPane是具備基於單詞(Word)為最小單位的自動換行功能的。對於中文而言,最小單位就是一個漢字;對於英文或拉丁語言而言,就

解決textarea不會自動的問題

用html的textarea標籤編輯錄入資料或文字的時候,按enter鍵換行錄入儲存,但是當重新從伺服器讀取資料的時候發現不會換行了,Google之後終於發現了原因並和解決方法 原因: 當在前端錄入資料的時候,按enter換行其實該換行符是“\n”,那麼在進行讀寫的時候都是

input不支援自動解決辦法

textarea與input input不支援換行; textarea: 1.支援換行; 2.左邊字型要想跑向左上角需要加程式碼; <textarea name="" id="" cols="" rows="" style="vertical-align:top;out

LaTex的listing,程式碼顯示的高階操作,不加空格對齊,自動和外邊框

近段時間使用latex往裡面添加了一些程式碼,看著是很好看,但是copy出來的程式碼卻一塌糊塗.到處都加滿了空格,還不能自動換行. S c i e n t i f i c computing f o r Lua .就像這樣,但是在網上也沒有找到相應的解決方法,最後只好到官方的指導文件上去找.官方

PL/SQL Developer設定 長SQL自動

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android 自定義View 解決 TextView 自動排版不整齊

第一次寫東西,內心小緊張,又不知道怎麼寫,儘量把遇到的問題和解決思路說清楚,寫的不好請見諒。 需求 專案有一個需求,很簡單,就是一個recyclerview,item裡面是兩個textview。一個TextView顯示的字串包含圓角、半形和中、英文以及數字。 想起來

解決TextView自動

Android開發中會經常遇到TextView自動切行的情況,解決辦法有兩種: 1,把所有字母、標點、符號、數字全部轉換成全形字元,讓其與漢字同樣佔用兩個位元組。 2,把所有字元,標點,符號換成英文符

uilabel 的相關處理 類富文字(自動,設定高,同一個label多種顏色,給文字加劃線 首縮排 等 等)

1.自動換行 UIFont *font=[UIFont systemFontOfSize:lableFont]; self.numberOfLines=0; self.lineBreakMode=NSLineBreakByWordWrapping; self.text=co

C# ASP.NET 2.0中禁止GridView的內容自動 (測試有效!!)

有人喜歡換行,我不喜歡換行,經MSDN論壇高人解答,測試後有效: 在原始檔模式下的頭部加入定義             .brk         {                 white-space:pre;         } 然後在繫結事件後 e.Row.C

TextView英文自動解決方法

TextView元件 遇到一個問題: 想將【TP-LINK_XXXXXXX】已ellipsize="end'的方式展示一部分,設定 android:layout_width="400px" android:ellipsize="end" android:maxLines=

div中英文無法自動解決辦法

在一個設定好寬度的div中,當我們輸入的中文文字長度超過了設定寬度時,會自動換到下一行。 但是,如果輸入的是英文字母,那麼,無論你div設定寬度為多少,英文字母都是不換行直接在同一行輸出,導致div的寬度遠遠超出設定的大小。 原因:這是因為div中,英文字母之間沒有空格

解決TextView排版自動問題

justified實現Textview和Edittext文字左右對齊 https://github.com/programingjd/justifiedhttp://blog.sina.com.cn/s/blog_73615d370100zpt5.html今天忽然發現and

解決eclipse的自動問題

安裝方法:使用Eclipse 的自動升級功能,選單欄選Help→install new Software然後按照提示進行安裝完成就可以了裝完後在程式碼編輯介面點右鍵,會出現“Word Warp ”屬性,

關於ul內插入內容標籤自動不在同一行問題

前提,li span {float:right;} 如果這麼寫 <li>美纖網<span>2013.05.23</span></li> 這個日期就會竄到下一行去 而如果這樣 <li><span>2013.05.23</span>

C# WinForm 中Label自動 解決方法

在TableLayoutPannel中放著一些Label 如果把Label的AutoSize屬性設成True的話,文字超過label長度時就會自動增加,直到後面的字出窗體以外 設定成False時,一旦到達Label的長度,後面的字元也就顯示不出來了 經過我的多番實踐,最

js獲取TextArea每一行字串(包括自動符)的解決方案

當TextArea開啟自動換行時,通過同步提交可以在後臺獲取到自動換行符,但是如果通過js讀取進行非同步提交時,卻無法獲取到自動換行符。這裡先給出兩種半吊子解決方案: 1 利用IE的createTextRange可以通過移動擴充套件游標直到內容超出TextArea寬度時結束,該方法不支援跨瀏覽

html td -解決長串英文字母或者數字不能自動的問題

原因是:   英書契母之間如果沒有空格,系統以為是一個單詞,就不會BUTO換行。漢字就沒有這種情況。   處理完成辦法:   用表格把要預示的內容裝起來。   在<table>標籤中加入"style='TBBLE-LBYOUT: fixed'",   在需好強制單詞換行的<td>標籤中

Html 解決長串英文字母顯示不能自動

英文字母之間如果沒有空格,系統認為這是一個單詞,就不會自動換行.漢字就沒有這種情況. 在<td>中加入 style="word-wrap:break-word;word-break:bre

解決瀏覽器顯示長數字不能自動或長字母不能的問題

在網頁中,如果出現長數字或長的字母組合時,如果不加以控制,它就會破壞網頁的佈局,控制不好可能就會顯示不全,照成顯示的資料丟失。雖然這種字串一般不會出現,但是不加以控制,被某些有心的人鑽了空子,就可能

CSS解決文字自動

1.單行文字溢位隱藏:p{ text-overflow: ellipsis;//必須 white-space: nowrap;//必須 overflow: hidden;//必須 }2.多行文字溢位隱藏:  (只適用移動端和 chrome)p{word-break: brea