Java运用SWT插件编写桌面记事本应用程序
本文实例介绍了java基于swt编写记事本的详细过程,分享给大家供大家参考,具体内容如下
可实现windows系统桌面记事本基本功能,傻瓜式教学,一步一步手把手操作。小白也可自己编写出完整的应用程序。
需要工具:eclipse(带swt插件)
成品如下:
应用程序功能介绍:
功能分析:
- 1.文件(f)
- 2.编辑(e)
- 3.格式(o)
- 4.查看(v)
- 5.帮助(h)
其中文件菜单中包括
1.1.新建(n) ctrl+n
1.2打开(o) ctrl+o
1.3保存(s) ctrl+s
1.4另存为(a)
1.5退出(x)
其中编辑菜单中包括:
2.1撤销(u) ctrl+z
2.2剪切(t) ctrl+t
2.3复制(c) ctrl+c
2.4粘贴(p) ctrl+v
2.5删除(l) del
2.6查找(d) ctrl+f
2.7查找下一处(n) f3
2.8替换(r) ctrl+h
2.9转到(g) ctrl+g
2.10全选(a) ctrl+a
2.11时间/日期(d) f5
其中格式菜单中包括
3.1自动换行(w)
3.2字体(f)
其中查看菜单中包括
4.1状态栏(s)
其中帮助菜单中包括
5.1查看帮助(h)
5.2关于记事本(a)
接下来会一步一步教大家手把手编写一个记事本
具体的几个类如下:
1.notepad.java
该类为主界面类,其中包含了各个按钮的监听事件
2.util.java类
该类为辅助类,方便在别的类中调用主窗口类中定义的成员
3.aboutauthor.java
关于作者的类,一个dialog窗口,用于显示作者信息
4.findwindow.java
查找功能的一个dialog窗口
5.go_to.java
转到功能的一个dialog窗口
6.openmethod.java
里面封装了打开文件的两个方法
7.savamethod.java
封装了保存文件的两种方法
8.swtresourcemanager.java
该类为外部导入的类,用于加载图片
9.test.java
程序入口,方便之后的打包程jar文件
10.quitmethod.java
封装了关闭窗口的两种方法
编写步骤:
一.新建swt项目以及第一个窗口的创建
打开eclipse,new->other->windowbuilder->swt designer->swt/jface java project .将project name 命名为 notepad
打开新建好的notepad工程,在scr处右键 new->package 新建一个包,命名为com.chance.org
tips:包的命名规则,最好用com.自定义.org ,别问为什么,以后工作了你就会明白了。
右键新建好的包 new->other ->windowbuilder->swt designer -> swt ->application window 命名为notepad
到此,我们便建好了第一个swt窗口点击source右边的design即可查看新建号的图形界面,实现可视化编程。
将notepad窗体中属性(properties)里的txt属性改名为:notepad
将composites中的composites组件拖入notepad组件下,并将其layout属性修改为filllayout,即填充式布局,这样即可方便后面将整个界面变成编辑域。接着将text组件拖入composites组件下。将text组件的属性style中的h_scroll属性以及v_scroll属性勾选为true
说明:h_scroll为横向滚动条,v_scroll为纵向滚动条
二.设置菜单栏的相关标签以及窗体总体布局
选择menu bar组件 将其拖入主窗体中
1.设置第一个菜单项(文件)
选择cascde menu组件,将其拖入menu bar组件中,修改属性:variable属性修改为file_menu, text修改为 文件(f);
1.1设置子菜单:新建(n) ctrl+n
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为new_file, text修改为:新建(n) ctrl+n;
1.2设置子菜单:打开(o) ctrl+o
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为open_file, text修改为:打开(o) ctrl+o
1.3设置子菜单:保存(o) ctrl+s
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为save_file, text修改为: 保存(o) ctrl+s
1.4设置子菜单:另存为(a)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为save_as, text修改为: 另存为(a)
1.5设置子菜单:退出(x)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为quit, text修改为: 退出(x)
2.设置第二个菜单项(编辑)
选择cascde menu组件,将其拖入menu bar组件中,修改属性:variable属性修改为edit_menu, text修改为 编辑(e);
2.1设置子菜单:撤销(u) ctrl+z
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为undo, text修改为: 撤销(u) ctrl+z, 并将enable改为false;
2.2设置子菜单:剪切(t) ctrl+t
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为cut, text修改为: 剪切(t) ctrl+t, 并将enable改为false;
2.3设置子菜单:复制(c) ctrl+c
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为copy, text修改为: 复制(c) ctrl+c, 并将enable改为false;
2.4设置子菜单:粘贴(p) ctrl+v
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为paste, text修改为: 粘贴(p) ctrl+v
2.5设置子菜单:删除(l) del
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为delete, text修改为: 删除(l) del, 并将enable改为false;
2.6设置子菜单:查找(d) ctrl+f
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为find, text修改为: 查找(d) ctrl+f, 并将enable改为false;
2.7设置子菜单:查找下一处(n) f3
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为find_next, text修改为: 查找下一处(n) f3, 并将enable改为false;
2.8设置子菜单:替换(r) ctrl+h
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为replace, text修改为: 替换(r) ctrl+h, 并将enable改为false;
2.9设置子菜单:转到(g) ctrl+g
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为go_to, text修改为: 转到(g) ctrl+g
2.10设置子菜单:全选(a) ctrl+a
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为selectall, text修改为: 全选(a) ctrl+a
2.11设置子菜单:时间/日期(d) f5
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为showdate, text修改为: 时间/日期(d) f5
3.设置第三个菜单项(格式)
选择cascde menu组件,将其拖入menu bar组件中,修改属性:variable属性修改为format_menu, text修改为 格式(o);
3.1设置子菜单:自动换行(w)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为auto_enter, text修改为: 自动换行(w)
3.2设置子菜单:字体(f)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为setfont, text修改为: 字体(f)
4.设置第四个菜单项(查看)
选择cascde menu组件,将其拖入menu bar组件中,修改属性:variable属性修改为view_menu, text修改为 查看(v);
4.1设置子菜单:状态栏(s)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为state, text修改为: 状态栏(s)
5.设置第五个菜单项(帮助)
选择cascde menu组件,将其拖入menu bar组件中,修改属性:variable属性修改为help_menu, text修改为 帮助(h);
5.1设置子菜单:查看帮助(h)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为lookhelp, text修改为: 查看帮助(h)
5.2设置子菜单:关于记事本(a)
选择menu item加入到cascde menu组件下,修改属性:variable属性修改为aboutauthor, text修改为: 关于记事本(a)
至此,已将整个页面布局设置完毕
效果图如下:
接下来实现各个功能
三.设置菜单快捷键
setaccelerator()函数的介绍:使用setaccelerator()函数设置相关的快捷键,传入的参数为键值
例如快捷键ctrl+n 设置方法为: 对象. setaccelerator(swt.ctrl+'n');
快捷键f5 设置方法为:对象.setaccelerator(swt.f5);
由此我们可以将所需的全部快捷键设置出来
new_file.setaccelerator(swt.ctrl + 'n'); //新建文件快捷键 open_file.setaccelerator(swt.ctrl + 'o');//保存文件快捷键 undo.setaccelerator(swt.ctrl + 'z'); //撤销快捷键 cut.setaccelerator(swt.ctrl + 't'); //剪切快捷键 copy.setaccelerator(swt.ctrl + 'c'); //复制快捷键 paste.setaccelerator(swt.ctrl + 'v'); //粘贴快捷键 delete.setaccelerator(swt.del); //删除快捷键 find.setaccelerator(swt.ctrl + 'f'); //查找快捷键 find_next.setaccelerator(swt.f3); //查找下一处快捷键 replace.setaccelerator(swt.ctrl + 'h'); //替换快捷键 go_to.setaccelerator(swt.ctrl + 'g'); //转到快捷键 selectall.setaccelerator(swt.ctrl + 'a');//全选快捷键 showdate.setaccelerator(swt.f5); //显示时间快捷键
四.添加事件监听函数(1)文件类
为文件每个菜单添加事件监听函数
1.添加”退出” 菜单的监听事件
功能描述:触发该菜单将退出应用程序
退出的实现比较简单,调用系统函数system.exit(0);即可
在design模式下点击”时间/日期(f5)”组件 再点击”show event”->selection->双击widgetselected
事件代码如下:
quit.addselectionlistener(new selectionadapter() { /** * 添加"退出"菜单的监听事件 * 功能描述:触发该菜单将退出应用程序 */ public void widgetselected(selectionevent e) { system.exit(0); } });
但事实真的这么简单吗,其实不然,哪有点击退出就直接退出的,真正的记事本,退出的时候可是还有提示的,于是乎,改进后的代码如下;
public void diyquit(){ /** * 退出函数退出时进行判断是否需要保存 */ string tips; system.out.println(util.shell.gettext().gettext()); if(util.shell.filedir != null || util.shell.gettext().gettext() != ""){ //文件目录不为空,说明有打开着的文件,需要询问是否保存 if(util.shell.filedir == null){ tips = "文件 无标题 的文字已经改变。\n"+"想保存文件吗"; }else{ tips = "文件 " +util.shell.filedir + " 的文字已经改变。\n"+"想保存文件吗"; } int n=joptionpane.showconfirmdialog(null, tips,"记事本",joptionpane.yes_no_cancel_option); if(n==0){ //是 返回0 否返回1 取消 返回2 savemethod savemethod = new savemethod(); savemethod.save(); //点是,则保存文件然后打开文件 }else if(n==1){ //返回否 system.exit(0); }else if(n==2){ //返回取消 return ; } system.exit(0); }else{ if(util.shell.gettext().gettext() != ""){ //若目录为空,但是内容不为空,说明有内容但未保存,提示之 tips = "文件 无标题 的文字已经改变。\n"+"想保存文件吗"; int n=joptionpane.showconfirmdialog(null, tips,"记事本",joptionpane.yes_no_cancel_option); if(n==0){ //是 返回0 否返回1 取消 返回2 savemethod savemethod = new savemethod(); savemethod.save(); //点是,则保存文件然后打开文件 }else if(n==1){ //返回否 system.exit(0); }else if(n==2){ //返回取消 return ; } system.exit(0); }else{ } } system.exit(0); }
接下来的每个监听事件内的操作我都定义为了一个函数,监听事件添加方法同第一步,具体实现方法如下:
2. 添加”另存为” 菜单的监听事件
功能描述:触发该菜单将弹出另存为的窗口,实现将文件另存为别处
这里为了方便代码的复用,另存为封装成方法进行调用
代码如下:
public void saveas(){ /** * 将另存为这个方法进行封装,方便调用 */ filedialog dialog = new filedialog(util.shell.shell,swt.save); dialog.setfilterpath(system.getproperty("c:\\documents and settings"));//设置打开默认的路径 dialog.setfilterextensions(new string[] {"*.txt", "*.*"}); //设置所打开文件的扩展名 dialog.setfilternames( new string[]{"text files (*.txt)", "all files (*.*)"}); //设置显示到下拉框中的扩展名的名称 string file = dialog.open();//打开窗口,返回用户所选的文件目录 if(file != null){ util.shell.filedir = file;//将文件目录保存下来,方面之后的使用 } if ( file != null ) { util.shell.shell.settext((new file( file.trim())).getname());//获取文件名(不含路径)用于设置title filewriter filewriter; try { filewriter = new filewriter(file); bufferedwriter out = new bufferedwriter(filewriter); out.write(util.shell.gettext().gettext()); out.close(); filewriter.close(); } catch (ioexception e1) { e1.printstacktrace(); } } }
3. 添加”保存” 菜单的监听事件
功能描述:触发”保存”菜单时,弹出保存文件窗口,然后选择目录和输入文件名进行保存
关于保存这里的逻辑我要好好说一说了:一开始一直在想如何才能确定当前文档是否是保存还是另存为,后来仔细观察桌面记事本才发现,原来保存和另存为弹出的对话框是同一个,只需要稍微加以区别就可判断是要保存还是要另存为了
判断如下:若是保存则说明存在filedir,直接调用保存的函数即可,若不存在filedir则说明文件时新打开的,还没确定过路径,因此跳转另存为窗体。
首先定义一个全局变量string filedir = null;将其赋值为空,默认所有的文件都未保存
接着不管是打开文件,还是另存为文件,都将文件所在目录(包括文件名以及后缀名)记录在filedir中,最后在保存事件中确定filedir是否为空即可。
代码如下:
public void save(){ /** * 保存文件 */ if(util.shell.filedir!=null ){ //表示该文件有目录,保存时直接保存,不需要弹窗 util.shell.shell.settext((new file( util.shell.filedir.trim())).getname());//获取文件名(不含路径)用于设置title filewriter filewriter; try { filewriter = new filewriter(util.shell.filedir); bufferedwriter out = new bufferedwriter(filewriter); out.write(util.shell.gettext().gettext()); out.close(); filewriter.close(); } catch (ioexception e1) { e1.printstacktrace(); } } else{//否则为从未保存过,则调用另存为窗口 saveas(); } }
4.添加”打开” 菜单的监听事件
功能描述:触发”打开”菜单时,弹出打开文件窗口,然后选择文件进行打开
为了实现代码的复用,将打开方法进行封装成函数
代码如下:
public void openfile(){ if(util.shell.filedir != null || util.shell.gettext().gettext() != ""){ string tips = "文件 " +util.shell.filedir + " 的文字已经改变。\n"+"想保存文件吗"; int n=joptionpane.showconfirmdialog(null, tips,"记事本",joptionpane.yes_no_cancel_option); if(n==0){ //是 返回0 否返回1 取消 返回2 savemethod savemethod = new savemethod(); savemethod.save(); //点是,则保存文件然后打开文件 }else if(n==1){ //返回否 }else if(n==2){ //返回取消 return ; } }else{ filedialog dialog = new filedialog(util.shell.shell,swt.open); dialog.setfilterpath(system.getproperty("c:\\documents and settings"));//设置打开默认的路径 dialog.setfilterextensions(new string[] {"*.txt", "*.*"});//设置所打开文件的扩展名 dialog.setfilternames( new string[]{"text files (*.txt)", "all files (*.*)"});//设置显示到下拉框中的扩展名的名称 string file = dialog.open();//打开窗口,返回用户所选的文件目录(包括文件名) if(file == null){ return ; } util.shell.filedir = file; util.shell.shell.settext((new file( file.trim())).getname());//获取文件名(不含路径)用于设置title filereader filereader; try { filereader = new filereader(file); bufferedreader in = new bufferedreader(filereader); string s = null; util.shell.gettext().settext(""); //将编辑框内容制空 try { while((s=in.readline())!=null){ util.shell.gettext().append(s+"\n"); } } catch (ioexception e1) { e1.printstacktrace(); } } catch (filenotfoundexception e2) { e2.printstacktrace(); } } }
5. 添加”新建” 菜单的监听事件
功能描述:触发事件时,实现新建一个窗口,若当前文件未保存,提示其保存,否则跳转产生新页面。
产生新页面的原理:将title重新初始化,将filedir初始化,以及把编辑域初始化即可
这里将打开新文件的代码抽出为一个方法,方便调用
代码如下:
void opennewfile() { if(util.shell.filedir != null || util.shell.gettext().gettext() != ""){ string tips = "文件 " +util.shell.filedir + " 的文字已经改变。\n"+"想保存文件吗"; int n=joptionpane.showconfirmdialog(null, tips,"记事本",joptionpane.yes_no_cancel_option); if(n==0){ //是 返回0 否返回1 取消 返回2 savemethod savemethod = new savemethod(); //点是,则保存文件然后打开文件 }else if(n==1){ //返回否 }else if(n==2){ //返回取消 return ; } string t = "无标题(" + ++util.shell.cnt + ") - 记事本"; util.shell.shell.settext(t); //设置标题 util.shell.gettext().settext(""); //清空编辑框 util.shell.filedir = null; }else{ string t = "无标题(" + ++util.shell.cnt + ") - 记事本"; util.shell.shell.settext(t); //设置标题 util.shell.gettext().settext(""); //清空编辑框 util.shell.filedir = null; } //所有的数据都初始化 }
四.添加事件监听函数(2)编辑类
为每个菜单添加事件监听函数
1.添加”显示时间”菜单的监听事件
功能描述:事件触发时,会在编辑框中光标所在处显示系统当时时间
实现:获取当前系统时间,将其转换成string型,再调用text.append(str)方法,将时间显示在编辑框光标之后
1.1添加事件监听函数
获取系统当前时间方法:调用simpledateformat对象格式化时间,再调用date获取时间。
刚开始存在的问题:每次都只能添加到内容结尾,仔细一想,必须要定位到当前光标所在位置,再将光标前的字符串+时间字符串+光标后的字符串 进行拼接,再一起显示出来。
找了好久找到了getcaretposition()刚好返回类型为整形,应该就是获取当前光标位置的,一试果然如此。接下来便是要实现字符串的拼接技术
字符串拼接:s1.substring(0, index) + s2 + s1.substring(index, s1.length());
返回的为新的字符串。
出现的问题:拼接好后直接输出,导致之前存在的内容与后来新的字符串又一次拼接,改了好久才发现需要调用settext(string)方法,在输出之前先将之前编辑框中显示的内容清空
最终监听函数内容如下:
showdate.addselectionlistener(new selectionadapter() { /** * 添加"时间日期"菜单的监听事件 * 功能描述:触发该菜单将当前系统时间添加到编辑框光标结尾处 */ public void widgetselected(selectionevent e) { int index = gettext().getcaretposition(); //获取当前编辑框中光标的位置 //system.out.println(index); simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");//设置日期格式 string localtime = df.format(new date()); string newstring = insertstring(gettext().gettext(),localtime,index); //拼接好后的字符串 gettext().settext("");//将原来编辑框的内容清空再将新的内容显示出来 //system.out.println(localtime);// new date()为获取当前系统时间 gettext().append(newstring); //将拼接好的字符串显示出来 } });
其中拼接字符串函数如下:
public string insertstring(string s1,string s2,int index){ /** * 实现字符串的插入函数 * 传入的三个参数为:原串,要插入的串,以及插入的位置 * 返回的为插入后的字符串 */ return s1.substring(0, index) + s2 + s1.substring(index, s1.length()); }
2.添加”全选”菜单监听事件
功能描述:触发该菜单将全部选定文本域字符串
java里面的编辑框竟然自带全选功能,哈哈,可以直接text.selectall()调用,那估计复制和粘贴也有现成的,差点忘了,全选后还需判断所选内容是否为空,不为空则需将”删除” “剪切”这两个按钮设置成可选
全选代码如下:
selectall.addselectionlistener(new selectionadapter() { /** * 添加"全选"菜单的监听事件 * 功能描述:触发该菜单将全部选中文本域的文字,同时将"删除" "剪切"这两个按钮设置成可选 */ public void widgetselected(selectionevent e) { gettext().selectall(); //直接调用自带的函数哟 if(gettext().gettext() !=null){ //若内容不为空,说明全选有内容,因此需要将"删除" "剪切" "复制"这三个按钮设置成可选 delete.setenabled(true); //将复制 cut.setenabled(true); copy.setenabled(true); } } });
3.添加”剪切”菜单监听事件
功能描述:触发该菜单,实现选择内容的剪切
直接调用编辑框的cut()方法
代码如下:
cut.addselectionlistener(new selectionadapter() { /** * 添加"剪切"菜单的监听事件 * 功能描述:触发该菜单将选中的字符串进行剪切 */ public void widgetselected(selectionevent e) { gettext().cut(); } });
4.添加”粘贴”菜单监听事件
功能描述:触发该菜单,实现将剪切板内容进行粘贴
直接调用编辑框的paste()方法
代码如下:
paste.addselectionlistener(new selectionadapter() { /** * 添加"粘贴"菜单的监听事件 * 功能描述:触发该菜单将剪切板中的内容粘贴到编辑框中 */ public void widgetselected(selectionevent e) { gettext().paste(); } });
5.添加”复制”菜单监听事件
功能描述:触发该菜单,实现将选择内容进行复制
直接调用编辑框的copy()方法
代码如下:
copy.addselectionlistener(new selectionadapter() { /** * 添加"剪切"菜单的监听事件 * 功能描述:触发该菜单将选中的字符串进行剪切 */ public void widgetselected(selectionevent e) { text.copy (); }
6.添加”撤销”菜单监听事件
功能描述:触发该菜单,撤销当前步操作
撤销该功能涉及到的算法优点复杂,暂时该记事本不支持按钮的撤销方法,但是支持右键的撤销(右键的撤销时java text组件自带的,又不是我写的,哈哈)
7.添加”查找”菜单监听事件
功能描述:触发该菜单,执行查找操作
find.addselectionlistener(new selectionadapter() { /** * 添加查找功能的对话框,其中需要点击查找,然后弹出一个对话框,输入查找的相关内容 */ public void widgetselected(selectionevent e) { findwindow fw = new findwindow(shell,swt.dialog_trim); fw.open(); } });
四.添加事件监听函数(3)辅助类
除了菜单栏的几个菜单事件外,还需要监听键盘事件,即若有键盘键入文本域,则会触发相关菜单的显示:撤销,查找,查找下一处,替换 这四个菜单设置成可选
1.文本域的监听
gettext().addkeylistener(new keyadapter() { /** * 设置键盘监听事件 * 有键盘键入则需要把相关按钮设置成可见:撤销,查找,查找下一处 */ public void keyreleased(keyevent e) { if(gettext().gettext()!=""){//说明有输入 find.setenabled(true); find_next.setenabled(true); replace.setenabled(true); }else{ find.setenabled(false); find_next.setenabled(false); replace.setenabled(true); } } });
2.实现”字体”菜单的事件监听函数
代码如下:
setfont.addselectionlistener(new selectionadapter() { /** * 设置字体的监听事件 */ public void widgetselected(selectionevent e) { fontdialog fontdialog = new fontdialog(shell, swt.none); font oldfont = gettext().getfont(); if(oldfont != null) { fontdialog.setfontlist(oldfont.getfontdata()); } fontdata fontdata = fontdialog.open(); if(fontdata == null) { return; } final display display = display.getdefault(); font newfont = new font(display, fontdata); gettext().setfont(newfont); if(oldfont != null) { oldfont.dispose(); } } });
五.窗体标签设置
将主函数提取到test类,并将记事本的窗体的标题参数化,在主函数中传入一个初始标签:”无标题 – 记事本”
在窗体类main_window中定义有参构造方法,传入的参数即为标题名
构造函数如下:
main_window(string titlename){ /** * 有参构造传入的参数为文件名 */ this.titlename = titlename; }
注意的是:刚开始运行软件 标题为: 无标题 – 记事本
打开文件时 标题为所打开的文件名
保存时 标题为所保存的文件名
另存为时 标题为另存为的文件名
已知路径获取文件名(不包含路径)的方法为:
shlnotepad.settext((new file( filedir.trim())).getname());//获取文件名(不含路径)用于设置title
这里为了简洁我已经将其缩写成一句话代码
设置了程序图标,将其放在工程目录下,即可直接引入使用
思考:提示用户是否保存时,不能用仅仅看路径是否为空,应该要检测键盘是否有按下,即是否有改变,以及内容是否有改变(有可能直接右键删除,并未经过键盘)
六.其他三个dialog对话框的定义
1.查找对话框
同样右键新建好的包 new->other ->windowbuilder->swt designer -> swt ->dialog命名为findwindow
成果图如下:
这里查找,替换,以及查找下一处都共用这一个窗口。查找内容编辑框有内容方可触发按钮可点击,查找内容编辑框与替换为编辑框同时不为空方可触发替换功能
这里列出查找下一处以及替换为的方法体
查找下一处:
思路:先获取主窗口中所有字符串,再获取需要查找的内容,直接调用java 自带的查找字符串函数获得起始索引,再加上查找内容的字符串长度即为需要渲染的字符串长度,再调用主窗口中的渲染函数,将字符串进行渲染再显示出来。
具体代码如下:
find_next.addselectionlistener(new selectionadapter() { @override public void widgetselected(selectionevent e) { parestr = util.shell.gettext_1(); //获取主窗口文本框内容 true index = parestr.indexof(textcontent.gettext(),index); //获取查找串在母串中的从index处开始的位置 if(index == -1){ joptionpane.showmessagedialog(null, "找不到\""+textcontent.gettext()+"\"","记事本", joptionpane.error_message); } int end = index+textcontent.gettext().length();//获得渲染的结束位置 util.shell.selectcontent(index, end); index = index+textcontent.gettext().length(); } });
替换按钮触发事件如下;
replacebtn.addselectionlistener(new selectionadapter() { /** * 替换按钮事件 */ public void widgetselected(selectionevent e) { parestr = util.shell.gettext_1(); //获取主窗口文本框内容 parestr = parestr.replacefirst(textcontent.gettext(), replacetext.gettext()); util.shell.showtext(parestr); } });
2.aboutauthor对话框的建立
该对话框的创建同查找对话框,将其命名为aboutauthor即可
具体效果图如下:
该对话框未涉及相关算法,添加三个jlabel标签然后输入三句话而已
3.go_to对话框的建立
对话框建立方法不多说,命名为go_to即可
具体效果图如下:
代码实现如下:
queding.addselectionlistener(new selectionadapter() { /** * 确定跳转到某行 */ public void widgetselected(selectionevent e) { int n = integer.parseint(goto_line.gettext()); goto_line.settext(""+ n + ""); util.shell.gotooneline(1); } });
调用主窗口中的gotooneline()方法
public void gotooneline(int row) { gettext().setselection(row); }
至此,整个记事本的一般功能已全部完成
七.总结
从刚开始编写,到最终的完成,花了大概2-3天,其中学到了很多相关的算法,java编程很方便,许多方法都不需要自己再去实现,直接调用即可,但是java也存在很多不足,比如,关闭窗口的方法我用的java自带的对话框,结果特别卡,各位感兴趣的可以自定义退出的对话框,只需将自带的三选对话框改成自定义的对话框即可。同时,前只是出于学习,并未考虑到算法发高效性,比如打开文件操作,只是实现了功能,但并未考虑算法的时效性,本例使用的方法是按行读取文件,你可以自己试试打开一个上千行的文本文档,你就能感觉得到算法的重要性,还有就是 向上查找并未实现,初步思路:找到需要查找的坐标找到,然后从查找的坐标的位置开始往回走,将查找内容也倒置,再调用java自带的字符串查找函数,
例如:
母串为 “ab记事本def3g” 需要从”3”这个字符串开始向前查找”记事本”字符串,可将母串中”3”字符串所在位置之前的字符串”ab记事本def”完全倒置为”g3fed本事记ba” 将查找内容也倒置成”本事记” 再调用java内带的字符串查找函数查找所在位置,再还原即可。
以上就是手把手编写记事本的详细步骤,java基于swt插件编写桌面记事本应用程序,希望对大家的学习有所帮助。
上一篇: asp.net上传图片保存到数据库的代码