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