首页天道酬勤java做文本编辑器(下面哪个不是java的文本编辑器)

java做文本编辑器(下面哪个不是java的文本编辑器)

admin 01-26 12:46 71次浏览

数据结构课要求完成简单的文本编辑器。 完成过程的构想、学习到的新知识、遇到的问题和解决方案等记录如下。

至少必须满足以下要求:

1 )有图形菜单界面

2 )查找、替换(等长、不等长)、插入)串刺、插入文本块)、快进)行块、列块移动)、删除

3 )可以正确保存、取出

4 )正确显示总行数

新方法:使用ActionEvent获取源(

从事件对象继承; 返回第一个发生事件的对象。

publicintgetlineofoffset (int offset ) throws基础架构

将文本中的偏移offset转换为行号

公共int获取位置(

返回文本插入符的位置。 插入记号的位置限制在0和文本的最后一个字符(包括)之间。 如果未设置文本或插入符,则默认插入符的位置为0。

indexOf (方法有四种形式:

公共索引of (intch ) :返回指定字符在字符串中第一个出现的索引,如果字符串中没有这样的字符,则返回-1。

公共索引of (intch,int fromIndex ) :从fromIndex位置搜索指定字符在字符串中出现的第一个索引,如果该字符串中没有这样的字符,则返回-1。

intindexof(stringstr ) :返回指定字符在字符串中首次出现的索引,如果字符串中没有这样的字符,则返回-1。

intindexof(stringstr,int fromIndex ) :从fromIndex位置搜索指定字符在字符串中出现的第一个索引,如果该字符串中没有这样的字符,则返回-1

同样,lastIndexOf (也返回最后出现的位置,反向搜索

获取文档() )

公共组件获取所有者(

如果此窗口是焦点窗口,则返回焦点窗口的子组件。

否则,即不是焦点窗口,则返回null。

公共布尔is focused (

返回:此窗口是否为焦点窗口。 如果有焦点所有者,则焦点窗口是包含焦点所有者的窗口。 如果焦点所有者不存在,则没有窗口成为焦点。

如果焦点窗口为框架或诊断程序,则它同时也是活动窗口。 否则,活动窗口将是第一个具有焦点窗口的帧或诊断程序。

的问题和解决方案使用缓冲读取器发生中文乱码

解决方案:保存文件时,设置代码为“ANSI”

文本选择结束,用键盘的左右键左右移动时

input.replaceSelection (' '; String text=input.getText (; text=text.substring(0,position ) stext text.substring position,text.length ); input.settext(text ); input.setcaretposition (positions text.length ) (-1 ); input.select (input.getcaretposition (-stext.length ) ) 1,input.getcaretposition )1); 想实现能够持续左右移动的效果。 也就是说,启动键盘监听器并左右移动后也选择文本,然后使用input.select(…)。 其中,input是JTextArea文本输入区域,但可以看到没有选择文本,但没有通过调试选中文本,所以如果聚焦思路,就会发现JTextArea 虽然是会报NullPointerException,但是也可以实现窗口对焦的功能,目前问题还没有解决。

若要完成想法,请使用当前光标位置input.addcaretlistener (newcaretlistener )、overridepublicvoidcaretupdate (jtextareaeditarea int listener ) jtea int columnNum=1; try { intcaretpos=editarea.getcaretposition (; //获取当前光标偏移linenum=editarea.getlineofoffset (caret pos ); //取得当前的光

标所在位置的行偏移量 columnNum = caretpos - editArea.getLineStartOffset(lineNum); //当前光标所在的列位置就是caretpos-这一行最初的列偏移量 lineNum += 1; //然后再将行的数目加1(从0开始计算偏移量) } catch(Exception ex) { } updateStatus(lineNum, columnNum); //updateStatus是更新状态栏的方法}}); 需要正确的获取文本内容的总行数
不能凭借光标的位置来判断总行数,应该以最后有内容的一行的行数来作为文本内容的总行数。记录光标到达过的最大行数maxCaretLine,从这一行开始判断,如果这一行为空,则再往上一行判断,如果这一行不为空,则为最后有内容的一行的行数。最初想到的判断方法是 for(int i = maxCaretLine;i >= 0;i --){ String value = input.getText().split("\r\n")[i]; if(value != null) { line = i; break; }}

但在换行的时候出现了问题,如果以分隔符来判断,换行后本来maxCaretLine应该等于2了,但是由于换行后用分隔符分割开的数组大小仍然为1(此时换行后还未新增内容)并且中间无论跳多少行都算作一行,所以改用BufferReader来读取每一行

打开和保存文件的选择路径方法我最开始使用的是JFileChooser int result = 0;String path = null;JFileChooser fileChooser = new JFileChooser();FileSystemView fsv = FileSystemView.getFileSystemView(); System.out.println(fsv.getHomeDirectory()); fileChooser.setCurrentDirectory(fsv.getHomeDirectory());fileChooser.setDialogTitle("打开");fileChooser.setApproveButtonText("确定");fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);fileChooser.addChoosableFileFilter(new FileFilter(){ @Overridepublic String getDescription() { return "文本文件"; }@Overridepublic boolean accept(File f) {if (f.getAbsolutePath().endsWith(".txt") || f.isDirectory()) return true; return false;}});result = fileChooser.showOpenDialog(openning);

但是后来找到了FileDialog(觉得更好看qaq)

文本筛选器:筛选出文本文件 fileChooser.addChoosableFileFilter(new FileFilter(){ @Overridepublic String getDescription() { return "文本文件"; }@Overridepublic boolean accept(File f) {if (f.getAbsolutePath().endsWith(".txt") || f.isDirectory()) return true; return false;}});

但是FileDialog对上面的方法不适用,并没有适用。jdoc的原注释为:Filename filters do not function in Sun’s reference implementation for Microsoft Windows.
所以就换了一种比较通俗的方法

FileDialog also = new FileDialog(openning,"另存为",FileDialog.SAVE);also.setFile("*.txt;");

直接将要查找的文件名设置为*.txt,就可以直接找到以txt为后缀的文件了。
暂时还没有找到更合适的筛选器。

实现移动整行和整列的效果:
思路:【数组】需要标识行数和列数——【二维数组】将每一行的数据保存在一个数组中,每一行用“\n”分割开为数组,每一行的字串再用“”分开,形成二维数组: String s = input.getText();String[][] a;String[] sFirst=s.split("\n");a=new String[sFirst.length][];//sFirst.length表示有多少行for(int i=0;i<sFirst.length;i++){String[] sSecond= sFirst[i].split("");a[i]=new String[sSecond.length];//sSecond.length分别表示每一行有多少列for(int j=0;j<sSecond.length;j++){a[i][j] = sSecond[j];if(maxColumn < a[i].length)maxColumn = a[i].length;}}

但在进行移动的时候,例如将第2行移动到第7行,那么第3-7行都要上移

String[] usedString = a[used-1];int i = used;for(;i < after; i++){a[i-1] = a[i]; }d[after-1] = usedString;

如果行数间隔大的话,for循环的时间就更长了,显然没有链表方便,【二维链表】将每一行的数据保存在一个单向链表中,将每一行的表头保存在一个行链表中形成一个二维链表,这样在移动的时候只需要更改一项就可以了。

UGUI实现ScrollView无限滚动效果
常用的文本编辑器(java做文本编辑器) java文本编辑器设计思路(java做文本编辑器)
相关内容