學java程式設計一段時間了,想利用java swing開發一個桌面的文本編輯器程式,首先想要實作的便是顯示行号的功能,由于要實作一些關鍵詞着色功能,選擇了JTextPane,其實還有一個JEditorPane也可以設定顔色屬性的,但JTextPane是繼承JEditorPane的,貌似功能應該更強大些。。接下來就是如何在JTextPane上實作行号顯示的功能了,首先第一個念頭是在一個JTextPane中實作實時輸入内容後計算行數,每行行号顯示在行首處,說得容易,實際操作并不如此,因為你要考慮使用者進行删除單詞等一系列的操作,而且這麼做的話文本框裡的内容連行号也包括了,當要輸出為一個檔案時就麻煩了,你還要想辦法去掉那些被當做文本内容的行号!
還有什麼辦法呢?經思考最終決定使用兩個JTextPane,一個作為文本輸入框,一個作為行号欄,大體如下,使用一個JFrame,JFrame使用BorderLayout布局,行号欄布局在BorderLayout.WEST,文本輸入框布局在CENTER,這樣就ok了,其中有一個發現要注意的是,要想行号欄上的行号與右邊文本框的每一行内容對齊,得用一樣的字型顔色屬性.....
以下分享一些代碼用于常見的擷取文本行數等屬性...
public class DocAttribute
{
//傳回光标所在列
public static int getColumnAtCaret(JTextComponent component)
{
int caretPosition = component.getCaretPosition();
Element root = component.getDocument().getDefaultRootElement();
int line = root.getElementIndex( caretPosition );
int lineStart = root.getElement( line ).getStartOffset();
return caretPosition - lineStart + 1;
}
//擷取指定行的第一個字元位置
public static int getLineStart(JTextComponent component,int line)
{
int lineNumber = line - 1;
Element root = component.getDocument().getDefaultRootElement();
int lineStart = root.getElement( lineNumber ).getStartOffset();
return lineStart;
}
//傳回選中的字元數
public static int getSelectedNumber(JTextComponent component)
{
if( component.getSelectedText() == null )
return 0;
else
return component.getSelectedText().length();
}
//傳回光标所在行
public static int getLineAtCaret(JTextComponent component)
{
int caretPosition = component.getCaretPosition();
Element root = component.getDocument().getDefaultRootElement();
return root.getElementIndex( caretPosition ) + 1;
}
//傳回文本行數
public static int getLines(JTextComponent component)
{
Element root = component.getDocument().getDefaultRootElement();
return root.getElementCount();
}
//傳回文本框的字元總數
public static int getCharNumber(JTextComponent component)
{
Document doc = component.getDocument();
return doc.getLength();
}