当前位置: 代码迷 >> Java相关 >> java开发文本编辑器手写之行号显示
  详细解决方案

java开发文本编辑器手写之行号显示

热度:92   发布时间:2016-04-22 20:18:21.0
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();    }
  相关解决方案