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