Java实战_手把手编写记事本

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写windows记事本源代码,具体功能如下: 1.文件(F) 可以通过点击菜单或快捷键(alt + F)打开菜单页 1.1新建(N) 菜单内点击或助记符N或快捷键(ctrl + N) 点击后弹出对话框,询问是否保存到***.txt? 点击保存(S):保存文本并关闭,再新建新的文本 点击不保存(N):不保存文本并关闭,再新建新的文本 点击取消:取消新建操作 1.2打开(O) 菜单内点击或助记符O或快捷键(ctrl + O) 点击后弹出对话框,询问是否保存到***.txt? 点击保存(S):保存文本,弹出选择文件对话框 点击不保存(N):不保存文本,弹出选择文件对话框 ==》选择文件对话框: 选择打开(O):就打开新的文本 选择取消:取消打开操作,返回原文本 点击取消:取消打开操作 1.3保存(S) 菜单内点击或助记符S或快捷键(ctrl + S) 点击后保存文本内容 1.4另存为(A) 菜单内点击或助记符A 点击后打开另存为对话框,选择路径和设置文件名 选择保存(S):就会在该路径保存文本,原文本内容不会保存并关闭,打开另存的文本 取消:取消另存为操作,返回原文本 1.5页面设置(U)(只实现页面边距,其他未实现) 菜单内点击或助记符U 点击后打开页面设置对话框:可以设置一下内容 纸张:大小(Z)、来源(S) 方向:纵向(O)、横向(A) 页面边距(毫米):左(L)右(R)上(T)下(B) 页眉(H)、页脚(F)、预览:(图片) 选择确定:保存新的页面设置 选择取消:取消页面设置 1.6打印(P)(改功能未完全实现,使用可能会报错) 菜单内点击或助记符P或快捷键(ctrl + P) 点击后弹出打印对话框 1.7退出(X) 菜单内点击或助记符X 点击后退出本文本文件 2.编辑(E) 可以通过点击菜单或快捷键(alt + E)打开菜单页 2.1撤销(U) 菜单内点击或助记符U或快捷键(ctrl + Z) 响应后返回上一步操作 2.2剪切(T) 菜单内点击或助记符T或快捷键(ctrl + X) 响应后光标选中的内容提取到剪贴板,并删除该内容,光标定位在元初识位置 2.3复制(C) 菜单内点击或助记符C或快捷键(ctrl + C) 响应后光标选中内容提取到剪贴板,光标位置保持不变 2.4粘贴(P) 菜单内点击或助记符P或快捷键(ctrl + V) 响应后光标选中的内容被替换为剪贴板的内容,光标选中刚刚粘贴的内容 2.5删除(L) 菜单内点击或助记符L或快捷键(DEL) 响应后删除光标选中的内容 2.6查找(F) 菜单内点击或助记符F或快捷键(ctrl + F) 响应后弹出查找对话框:输入查找的内容,可以选择区分大小写和选择查找的方向 点击查找之后光标会选中响应的查找内容,没找到会弹出找不到对话框 2.7查找下一个(N) 菜单内点击或助记符N或快捷键(F3) 查找框有内容就直接查找贯标位置以后的内容,查找框没有内容直接弹出查找框 2.8替换(R) 菜单内点击或助记符R或快捷键(ctrl + H) 弹出替换对话框,有全部替换和替换当前两种 当前替换:替换光标选中的内容,光标移动到下一个查找内容上 2.9转到(G) 菜单内点击或助记符G或快捷键(ctrl + G) 在自动换行未选中的情况下,点击之后弹出转到指定行对话框 2.10全选(A) 菜单内点击或助记符A或快捷键(ctrl + A) 响应后选中全部文本内容 2.11时间/日期(D) 菜单内点击或助记符D或快捷键(F5) 在光标选中的内容里修改为当前时间 3.格式(O) 可以通过点击菜单或快捷键(alt + O)打开菜单页 3.1自动换行(W) 菜单内点击或助记符W 选中后,文本会自动换行,且不能点击查看状态栏和转到菜单 3.2字体(F) 菜单内点击或助记符F 弹出字体对话框:可以选择字体(F)、字形(Y)大小(S) 拥有示例和选择脚本,确定后更改全部字体 4.查看(V) 可以通过点击菜单或快捷键(alt + V)打开菜单页 4.1状态栏(S) 菜单内点击或助记符S 在底部会显示光标的起始坐标,第几行第几列 5.帮助(H) 可以通过点击菜单或快捷键(alt + H)打开菜单页 5.1查看帮助(H) 菜单内点击或助记符H 点击弹出帮助文本 5.2关于记事本(A)、 菜单内点击或助记符A 点击弹出关于记事本的对话框 显示它的版本信息
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值