天天看點

java顯示行号_java開發文本編輯器手記之行号顯示

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

}