第十四周课程总结&实验报告

第十四周课程总结&实验报告(简单记事本的实现) 

 

摘要

随着人们生活节奏的加快,要做的事情也越来越多,俗话说:好记性不如烂笔头,我们每个人几乎必备的一款软件就是记事本软件。工作生活中我们往往会被繁重事务压得喘不过气来,导致有些事情忘记做了或者没有及时处理。这时就少不了记事本这个“小秘书”,拥有一款好用的记事本软件就不会经常工作丢三落四了。 亦或有一些信息或数据来不及处理,也可以先保存在记事本中,以便之后处理。

本记事本程序使用JAVA语言开发,AWT、Swing实现图形界面展示,使用JAVA IO、JAVA类库来完善新建、新窗口、打开、保存、另存为、退出、撤销、恢复、查找/替换、转到、时间/日期、自动换行、改变字体、缩放、状态栏、改变颜色、提示是否保存等功能。

本文设计和实现记事本程序对于提高人们的工作效率,增强工作质量有明显的意义,本文的研究设计过程对于相关程序的设计和开发具有一定的指导和实践意义。

 

 

关键词  记事本程序   JAVA  工作办公

 

1.    前言

 

随着计算机技术的快速发展,如今很多人的工作都离不开电脑,在面对繁多的工作任务时,往往会忘掉一些事情,从而可能造成不必要的损失。所以需要一款软件去记录这些琐事,以提高人们的工作效率与工作质量。有时有一些重要的信息或数据也需要记事本先保存下来以便后续使用。

 

本记事本程序能实现对文本的保存、编辑,还提供了一些便于对文本进行操作的人性化功能,可以有效解决人们在办公方面的问题。

 

 

 

1.1        系统描述

 

1.1.1. 设计背景

 

随着人们生活节奏的加快,日常事务正越来越多,随着时间的推移,人们难免会忘记一些事情,此时就需要一款方便的记事本软件去记录这些琐事。 有时有一些重要的信息一时半会记不住,也可以先将它保存在记事本中,日后要用到时只需打开记事本查看就行了。

 

 

 

1.1.2. 设计任务及目标

 

记事本程序具体功能如下:

 

(1)   实现新建记事本功能。

 

(2)   实现新窗口功能。

 

(3)   实现打开文本文件的功能。

 

(4)   实现文本文件的保存和另存为功能。

 

(5)   实现退出当前记事本功能。

 

(6)   实现撤销与恢复功能。

 

(7)   实现查找与替换功能。

 

(8)   实现转到指定行功能。

 

(9)   实现文本追加日期与时间的功能。

 

(10)         实现选择是否自动换行的功能。

 

(11)         实现更改字体、字形、大小的功能。

 

(12)         实现缩放与一键恢复默认缩放的功能。

 

(13)         实现状态栏显示光标处于第几行第几列、字符数的功能

 

(14)         实现是否显示状态栏的功能。

 

(15)         实现更改背景与字体颜色的功能。

 

(16)         实现提示是否保存更改的功能。

 

(17)         实现从右到左的阅读顺序的功能。

 

 

 

1.2        系统开发工具

 

1.2.1 开发技术

 

Java,Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 [1]  。

 

Java具有简单性、面向对象、分布式健壮性安全性、平台独立与可移植性、多线程、动态性等特点 [2]  。Java可以编写桌面应用程序Web应用程序分布式系统嵌入式系统应用程序等 。

 

1.2.2 开发环境

 

JDK,JDK(Java Development Kit)称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一些Java工具和Java的核心类库(Java API)

 

本系统选用jdk1.6的版本进行开发。

 

(1)    集成开发工具Eclipse

 

MyEclipse,是在 eclipse 基础上加上自己的插件开发而成的功能强大的企业级集成开发环境,主要用于Java、Java EE以及移动应用的开发。MyEclipse的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持相当不错。

 

MyEclipse,是一个十分优秀的用于开发 Java, J2EE 的 Eclipse 插件集合,MyEclipse 的功能非常强大,支持也十分广泛,尤其是对各种开源产品的支持十分不错。MyEclipse 可以支持 Java Servlet,AJAX,JSP, Struts,Spring,Hibernate, JDBC 数据库链接工具等多项功能。可以说 MyEclipse 是几乎囊括了目前所有主流开源产品的专属 eclipse 开发工具。

 

2.    需求分析

 

2.1        功能分析

 

新建:如果当前记事本文本未被改变过,则退出当前记事本,打开一个新的记事本;如果当前记事本文本被改变过,则跳出是否保存对话框。

 

新窗口:打开一个新的记事本。

 

打开:如果当前记事本文本未被改变过,则跳出文件选择对话框,将选中的文本文件读入记事本文本域;如果当前记事本文本被改变过,则跳出是否保存对话框。

 

保存:如果文本被保存过,则直接保存到原有文件中;如果文本未被保存过,则执行另存为功能。

 

另存为:跳出文件选择框,将文件保存到选择的路径下。

 

退出:如果当前记事本文本未被改变过,则退出当前记事本;如果当前记事本文本被改变过,则跳出是否保存对话框。

 

撤销/恢复:撤销文本到编辑前的内容/恢复文本到编辑后的内容。

 

查找/替换:查找指定内容,替换为指定内容;可以选择是否循环查找、是否区分大小写、查找方向前进或后退;文本没有指定查找内容则提示“没有找到**”;查找到文件末尾时发出提示音。

 

转到:光标转到指定行;输入值为非数字时提示“请输入数字”,输入值大于文本行数时提示“行数超过了总行数”。

 

时间/日期:对文本追加当前日期和时间。

 

从右到左的阅读顺序:文本输入顺序更改为从右到左。

 

自动换行:选择是否自动换行。

 

字体:可以更改字体样式、字形、字号。字号输入值为非数字时提示“请输入数字”,没有输入值这一选项时提示“没有此选项”。

 

缩放:文本放大与缩小;可以一键恢复默认缩放。

 

状态栏:选择是否显示状态栏。

 

颜色:更改字体颜色和文本域背景颜色。

 

 

 

2.2        存在问题

 

(1)     文本丢失问题

 

在点击新建、打开、退出时,如果直接进行新建、打开、退出操作,可能导致已更改文本的丢失,所以如果文本已被修改过,必须提示是否保存当前文本再进行后续操作。

 

(2)     文本保存问题

 

如果是已经保存过的文本,再次保存应直接保存在原文件中 ,而未保存过的文本,点击保存按钮执行的应是另存为的方法。

 

(3)     输入值问题

 

转到行、字体、字形、字号等可以通过输入值来选择选项,但如果输入了非法值或没有的选项则需要提示用户。

 

(4)      多窗口退出问题

 

当同时存在多个记事本窗口时,只要退出其中一个窗口,就会退出整个系统,其他窗口也会退出。

 

 

 

 

 

 

 

 

 

 

 

 

 

2.3        解决方案

 

(1)     是否保存对话框解决文本丢失问题

 

在执行打开、新建、退出操作之前,判断文本是否被改变过,是则跳出是否保存对话框,处理完是否保存对话框之后再执行相应的操作。是否保存对话框选择保存则先执行保存操作。

 

(2)     判断记事本标题解决文本保存问题

 

在打开文件或保存文件后记事本标题会更改为文件名,如果记事本标题不是无标题则说明文件被保存过至少一次,后续再点击保存按钮就直接保存到原有文件中,否则执行另存为操作。

 

(3)     对选项进行遍历或异常处理解决输入值问题

 

将所输入的内容与所有选项一个一个进行匹配,如均未匹配成功则提示“没有此选项”,对转到行、字号输入的内容强制转型为整型,如果输入的不是数字则会出现异常,异常处理方法改为提示“请输入数字”。

 

(4)     改变窗口退出模式解决多窗口退出问题

 

用SetDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE)方法实现仅退出当前窗体而不是退出整个系统。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.    详细设计

 

3.1        系统设计

 

记事本主要功能如图2.1.1所示

 

 

 

 

 图2.1.1

 

颜色功能如图2.1.2所示

 

 

 

 

 

 

图2.1.2

 

 

 

 

 

 

 

查找/替换功能如图2.1.3所示

 

 

 

 

 

 

图2.1.3

 

字体功能如2.1.4所示

 

 

 

 

 

 

图2.1.4

 

 

 

 

 

 

 

 

 

3.2        系统支持环境和开发环境

 

(1)   支持环境

 

操作系统:Windows或者 linux。

 

(2)   系统的开发环境

 

开发语言:JAVA;

 

开发工具:Eclipse

 

4.    系统实现

 

4.1        代码设计

 

Notepad类

public class Notepad implements ActionListener  , CaretListener , ItemListener , MouseWheelListener{
    //记事本窗口
    static int windownum=0;                  //记录窗口数目
    int pos,lineOfC,col,zishu,lastzishu;     //行、列、字数、新建打开文本时的字数
    boolean ischange;                        //记录文本域是否被改变过
    JFrame frame = new JFrame("无标题 - 记事本");     //声明一个窗体对象
    Container cont = frame.getContentPane(); //得到窗体容器
    JTextArea jta = new JTextArea();         //构造一个文本域
    JScrollPane scr = new JScrollPane(jta,
            JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);//滚动条组件,按需要出现
    JMenu menuFile = new JMenu("文件(F)");       //定义JMenu组件
    JMenu editFile = new JMenu("编辑(E)");       //定义JMenu组件
    JMenu formatFile = new JMenu("格式(O)");     //定义JMenu组件
    JMenu visonFile = new JMenu("查看(V)");      //定义JMenu组件
    JMenu zoomFile = new JMenu("缩放(Z)");       //定义JMenu组件
    JMenu helpFile = new JMenu("帮助(H)");       //定义JMenu组件
    JMenuBar menuBar = new JMenuBar();           //定义JMenuBar
    JMenuItem newItem = new JMenuItem("新建(N)");//创建JMenuItem
    JMenuItem windowItem = new JMenuItem("新窗口(W)");//创建JMenuItem
    JMenuItem openItem = new JMenuItem("打开(O)");//创建JMenuItem
    JMenuItem exitItem = new JMenuItem("退出(E)");//创建JMenuItem
    JMenuItem typeface = new JMenuItem("字体(F)");//创建JMenuItem
    JMenuItem saveItem = new JMenuItem("保存(S)");//创建JMenuItem
    JMenuItem osaveItem = new JMenuItem("另存为(B)");//创建JMenuItem
    JMenuItem revokeItem = new JMenuItem("撤销(U)");//创建JMenuItem
    JMenuItem recovery = new JMenuItem("恢复(Y)");//创建JMenuItem
    JMenuItem findreplace = new JMenuItem("查找/替换(F)");//创建JMenuItem
    JMenuItem gotoItem = new JMenuItem("转到(G)");//创建JMenuItem
    JMenuItem dateItem = new JMenuItem("时间/日期(D)");//创建JMenuItem
    JMenuItem enlargeItem = new JMenuItem("放大(I)");//创建JMenuItem
    JMenuItem narrowItem = new JMenuItem("缩小(O)");//创建JMenuItem
    JMenuItem colorItem = new JMenuItem("颜色(C)");//创建JMenuItem
    JMenuItem recoveryItem = new JMenuItem("恢复默认大小");//创建JMenuItem
    JMenuItem aboutItem = new JMenuItem("关于记事本(P)");//创建JMenuItem
    JCheckBox statusItem = new JCheckBox("状态栏(S)",true);//创建JMenuItem
    JCheckBox linewrap = new JCheckBox("自动换行(W)");//创建JCheckBox 
    JCheckBox orderItem = new JCheckBox("从右到左的阅读顺序(R)");//创建JCheckBox
    JLabel hanglie = new JLabel("字符数:0          当前光标位置:第1行,第1列",JLabel.CENTER);
    MouseWheelListener sysWheel;
    
    //“是否保存”窗体
    int ispass;                              //判断是哪种按钮导致的isSave窗体跳出
    JDialog isSave = new JDialog(frame, "是否保存",true);         //定义子窗体
    Container cont1 = isSave.getContentPane(); //得到窗体容器
    JLabel label1 = new JLabel("是否将更改保存?",JLabel.LEFT);
    JButton save = new JButton("保存(S)");      //声明一个按钮
    JButton nosave = new JButton("不保存(N)");  //声明一个按钮
    JButton cancel = new JButton("取消");       //声明一个按钮
    JPanel pan = new JPanel(new FlowLayout(FlowLayout.RIGHT));               //实例化一个JPnel对象
    JSplitPane fenge = new JSplitPane(JSplitPane.VERTICAL_SPLIT,label1,pan);
    
    //“转到”窗口
    JDialog gotoframe = new JDialog(frame,"转到指定行",true);         //定义子窗体,true代表必须先处理此窗口
    JLabel linenumber = new JLabel("行号:");                        //声明一个标签
    JTextField lineText = new JTextField();                           //声明一个文本框
    JButton go= new JButton("转到");                                  //声明一个按钮
    JButton cancelgo = new JButton("取消");                           //声明一个按钮
    
    //“字体”窗口
    int fontsize;                              //保存设置的字体大小,用于恢复默认缩放
    JDialog script = new JDialog(frame,"字体",false);        //定义子窗体,true代表必须先处理此窗口
    Container cont2 = script.getContentPane();               //得到窗体容器
    GraphicsEnvironment eq = GraphicsEnvironment.getLocalGraphicsEnvironment();//取得本地的绘图设备和文字的集合
    String[] fontNames = eq.getAvailableFontFamilyNames();                     //取得全部可用的字体
    String glyph[] = {"常规","粗体","倾斜","粗体倾斜"};       //定义字形
    String fontSize[] = {"10","12","14","16","18","20","22","24","26","48","72"};//定义文字大小
    JComboBox jcbscript = new JComboBox(this.fontNames);//实例化JComboBox
    JComboBox jcbglyph = new JComboBox(this.glyph);//实例化JComboBox
    JComboBox jcbfontSize = new JComboBox(this.fontSize);//实例化JComboBox
    JButton scrsave = new JButton("确定");      //声明一个按钮
    JButton scrcancel = new JButton("取消");    //声明一个按钮
    
    //“查找/替换”窗口
    boolean aA,lo;    //表示是否区分大小写,是否循环
    int dir;          //表示查找方向(8:向前,2:向后)
    int next,head;    //表示所查文本末尾和首部在文本中的位置,
    JDialog findframe = new JDialog(frame,"查找/替换",false);         //定义子窗体,true代表必须先处理此窗口
    JLabel findLab = new JLabel("查找(F):");      //声明一个标签
    JButton findlab = new JButton();               //此按钮用以添加快捷键
    JLabel replaceLab = new JLabel("替换为(E):"); //声明一个标签
    JButton replacelab = new JButton();            //此按钮用以添加快捷键
    JTextField findText = new JTextField();        //声明一个文本框
    JTextField replaceText = new JTextField();     //声明一个文本框
    JRadioButton forward = new JRadioButton("前进(O)",true);//定义一个单选钮
    JRadioButton backoff = new JRadioButton("后退(B)");//定义一个单选钮
    ButtonGroup direction = new ButtonGroup();         //定义一个按钮组
    JCheckBox loop = new JCheckBox("循环(P)",true);       //定义一个复选框
    JCheckBox sensitive = new JCheckBox("区分大小写(C)",true); //定义一个复选框
    JButton find = new JButton("查找(N)");                //声明一个按钮
    JButton replace = new JButton("替换(R)");             //声明一个按钮
    JButton finrep = new JButton("查找/替换(D)");         //声明一个按钮
    JButton allreplace = new JButton("全部替换(A)");      //声明一个按钮
    JButton close = new JButton("关闭");                  //声明一个按钮
    JPanel pandirection = new JPanel();                   //定义一个面板
    
    //“颜色”窗口
    JDialog colorframe = new JDialog(frame,"颜色设置");
    Container colorcont = colorframe.getContentPane();     //得到窗体容器
    JTabbedPane tab = new JTabbedPane(JTabbedPane.TOP);    //设置标签在顶部显示
    JPanel typefacepan = new JPanel();                     //设置面板
    JPanel backgroundpan = new JPanel();                   //设置面板
    JColorChooser typefacecolor=new JColorChooser(Color.BLACK);//实例化颜色选择器,初始颜色为黑色
    JColorChooser backgroundcolor=new JColorChooser();     //实例化颜色选择器
    JPanel colorPan=new JPanel(new FlowLayout(FlowLayout.RIGHT));//声明一个面板
    JButton colorsave = new JButton("确定(Y)");                     //声明一个按钮
    JButton colorcancel = new JButton("恢复默认(N)");                   //声明一个按钮
    JSplitPane tbsplit = new JSplitPane(JSplitPane.VERTICAL_SPLIT,tab,colorPan);//上下分割线
    
    //文件
    File file = null;                           //接收打开的文件
    int result = 0;                             //接收操作的结果
    JFileChooser fileChooser = new JFileChooser();//实例化文件选择框
    
    //撤销\恢复
    UndoManager undo = new UndoManager();        //定义撤销变量
    
    //“关于记事本”窗口
    JDialog aboutframe = new JDialog(frame,"关于记事本",true);//定义子窗口
    String picPath = "C:"+File.separator+"Users"+File.separator+"admin"+File.separator+"Desktop"+File.separator+"记事本图标.png";
    Icon icon = new ImageIcon(picPath);                       //实例化Icon对象
    JLabel lab = new JLabel(icon);                //实例化对象,使用靠左对齐
    JLabel lab2 = new JLabel("何磊的记事本:版本号:2019(1.0)");
    
    public Notepad(){
        windownum++;                                //记事本窗口数加一
        ischange=true;                              //文本域没被改变过
        //记事本窗体
        frame.setLayout(new BorderLayout());//设置布局管理器
        frame.addWindowListener(new WindowAdapter(){//加入窗口监听
            //覆写窗口关闭的方法
            public void windowClosing(WindowEvent e){
                if(ischange||frame.getTitle().equals("无标题 - 记事本")&&zishu==0){
                    windownum--;
                    if(windownum==0){                                    //最后一个窗口退出就关闭系统
                        System.exit(0);
                    }else
                    frame.dispose();                                     //关闭窗口
                    }else{
                        ispass = 3;
                        isSave.setVisible(true);                         //跳出isSave窗体
                    }
            }
        });
        jta.addCaretListener(this);          //加入光标事件监听器
        jta.getDocument().addUndoableEditListener(undo);//加入监听器
        linewrap.addItemListener(this);      //加入JCheckBox监听
        statusItem.addItemListener(this);    //加入JCheckBox监听
        orderItem.addItemListener(this);     //加入JCheckBox监听
        windowItem.addActionListener(this);  //加入菜单项监听
        exitItem.addActionListener(this);    //加入菜单项监听
        newItem.addActionListener(this);     //加入菜单项监听
        saveItem.addActionListener(this);    //加入菜单项监听
        osaveItem.addActionListener(this);   //加入菜单项监听
        openItem.addActionListener(this);    //加入菜单项监听
        gotoItem.addActionListener(this);    //加入菜单项监听
        dateItem.addActionListener(this);    //加入菜单项监听
        typeface.addActionListener(this);    //加入菜单项监听
        revokeItem.addActionListener(this);  //加入菜单项监听
        recovery.addActionListener(this);    //加入菜单项监听
        typeface.addActionListener(this);    //加入菜单项监听
        enlargeItem.addActionListener(this); //加入菜单项监听
        narrowItem.addActionListener(this);  //加入菜单项监听
        recoveryItem.addActionListener(this);//加入菜单项监听
        findreplace.addActionListener(this); //加入菜单项监听
        aboutItem.addActionListener(this);   //加入菜单项监听
        colorItem.addActionListener(this);   //加入菜单项监听
        scr.addMouseWheelListener(this);     //加入鼠标滚轮监听
        menuFile.setMnemonic('F');           //设置快捷键F
        editFile.setMnemonic('E');           //设置快捷键E
        formatFile.setMnemonic('O');         //设置快捷键O
        newItem.setMnemonic('N');            //设置快捷键N
        openItem.setMnemonic('O');           //设置快捷键O
        windowItem.setMnemonic('W');         //设置快捷键W
        saveItem.setMnemonic('S');           //设置快捷键S
        osaveItem.setMnemonic('B');          //设置快捷键A
        exitItem.setMnemonic('E');           //设置快捷键E
        findreplace.setMnemonic('F');        //设置快捷键F
        gotoItem.setMnemonic('G');           //设置快捷键G
        dateItem.setMnemonic('D');           //设置快捷键D
        revokeItem.setMnemonic('U');         //设置快捷键Z
        recovery.setMnemonic('Y');           //设置快捷键Y
        linewrap.setMnemonic('W');           //设置快捷键W
        typeface.setMnemonic('F');           //设置快捷键F
        visonFile.setMnemonic('V');          //设置快捷键V
        zoomFile.setMnemonic('Z');           //设置快捷键Z
        helpFile.setMnemonic('H');           //设置快捷键H
        enlargeItem.setMnemonic('I');        //设置快捷键I
        narrowItem.setMnemonic('O');         //设置快捷键O
        statusItem.setMnemonic('S');         //设置快捷键S
        aboutItem.setMnemonic('P');          //设置快捷键P
        orderItem.setMnemonic('R');          //设置快捷键R
        colorItem.setMnemonic('C');          //设置快捷键C
        newItem.setAccelerator(KeyStroke.getKeyStroke('N', java.awt.Event.CTRL_MASK));//Ctrl+N
        openItem.setAccelerator(KeyStroke.getKeyStroke('O', java.awt.Event.CTRL_MASK));//Ctrl+O
        windowItem.setAccelerator(KeyStroke.getKeyStroke('W', java.awt.Event.CTRL_MASK));//Ctrl+W
        saveItem.setAccelerator(KeyStroke.getKeyStroke('S', java.awt.Event.CTRL_MASK));//Ctrl+S
        osaveItem.setAccelerator(KeyStroke.getKeyStroke('B', java.awt.Event.CTRL_MASK));//Ctrl+A
        revokeItem.setAccelerator(KeyStroke.getKeyStroke('Z', java.awt.Event.CTRL_MASK));//Ctrl+Z
        recovery.setAccelerator(KeyStroke.getKeyStroke('Y', java.awt.Event.CTRL_MASK));//Ctrl+Y
        findreplace.setAccelerator(KeyStroke.getKeyStroke('F', java.awt.Event.CTRL_MASK));//Ctrl+F
        gotoItem.setAccelerator(KeyStroke.getKeyStroke('G', java.awt.Event.CTRL_MASK));//Ctrl+G
        dateItem.setAccelerator(KeyStroke.getKeyStroke('D', java.awt.Event.CTRL_MASK));//Ctrl+D
        enlargeItem.setAccelerator(KeyStroke.getKeyStroke(107,java.awt.Event.CTRL_MASK));//Ctrl+numpad_加号键
        narrowItem.setAccelerator(KeyStroke.getKeyStroke(109,java.awt.Event.CTRL_MASK));//Ctrl+numpad_减号键
        recoveryItem.setAccelerator(KeyStroke.getKeyStroke(96,java.awt.Event.CTRL_MASK));//Ctrl+numpad_0
        menuFile.add(newItem);               //加入菜单项
        menuFile.add(windowItem);            //加入菜单项
        menuFile.add(saveItem);              //加入菜单项
        menuFile.add(osaveItem);             //加入菜单项
        menuFile.add(openItem);              //加入菜单项
        menuFile.addSeparator();             //加入分隔线
        menuFile.add(exitItem);              //加入菜单项
        editFile.add(revokeItem);            //加入菜单项
        editFile.add(recovery);              //加入菜单项
        editFile.addSeparator();             //加入分隔线
        editFile.add(findreplace);           //加入菜单项
        editFile.add(gotoItem);              //加入菜单项
        editFile.addSeparator();             //加入分隔线
        editFile.add(dateItem);              //加入菜单项
        formatFile.add(orderItem);           //加入菜单项
        formatFile.add(linewrap);            //加入菜单项
        formatFile.add(typeface);            //加入菜单项
        zoomFile.add(enlargeItem);           //加入菜单项
        zoomFile.add(narrowItem);            //加入菜单项
        zoomFile.add(recoveryItem);          //加入菜单项
        visonFile.add(zoomFile);             //加入菜单项
        visonFile.add(statusItem);           //加入菜单项
        visonFile.add(colorItem);            //加入菜单项
        helpFile.add(aboutItem);             //加入菜单项
        jta.setFont(new Font("微软雅黑",Font.PLAIN,20));//定义显示字体
        fontsize=20;
        menuBar.add(menuFile);               //加入menu
        menuBar.add(editFile);               //加入edit
        menuBar.add(formatFile);             //加入format
        menuBar.add(visonFile);              //加入visonFile
        menuBar.add(helpFile);               //加入helpFile
        frame.setJMenuBar(menuBar);            //加入菜单栏
        frame.add(scr,BorderLayout.CENTER);    //文本加入到窗体
        frame.add(hanglie,BorderLayout.SOUTH);//状态栏加入到窗体
        frame.setSize(800,700);              //设置窗体大小
        frame.setLocation(600,200);          //设置窗体显示位置
        frame.setVisible(true);              //让组件显示
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//退出应用程序不做任何事情,由窗口监听进行处理
        hanglie.setFont(new Font("微软雅黑",Font.PLAIN,15));
        sysWheel = scr.getMouseWheelListeners()[0];//得到系统滚动事件
        scr.removeMouseWheelListener(sysWheel);//移除系统滚动,需要时添加

        //“是否保存”窗口
        cancel.addActionListener(this);          //加入按钮项监听
        nosave.addActionListener(this);          //加入按钮项监听
        save.addActionListener(this);            //加入按钮项监听
        label1.setFont(new Font("微软雅黑",Font.PLAIN,20));
        save.setMnemonic('S');                   //设置快捷键S
        nosave.setMnemonic('N');                 //设置快捷键N
        pan.add(save);                           //加入按键组件
        pan.add(nosave);                         //加入按键组件
        pan.add(cancel);                         //加入按键组件
        fenge.setDividerLocation(50);            //设置上下的分割线的位置,按百分比
        fenge.setDividerSize(1);                 //设置上下的分割线大小,0为没有分割线
        cont1.add(fenge);                         //JSplitPane加入到窗体
        isSave.setSize(300,125);                 //设置窗体大小
        isSave.setLocation(800,500);             //设置窗体显示位置
        isSave.setResizable(false);              //设置窗体能否改变大小
        isSave.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
        //“转到”窗口
        go.addActionListener(this);                                 //加入动作监听
        cancelgo.addActionListener(this);                           //加入动作监听
        gotoframe.setLayout(null);                                  //定义排版
        linenumber.setFont(new Font("微软雅黑",Font.PLAIN,15));     //定义显示字体
        linenumber.setBounds(10, 10, 100, 16);                      //设置位置及大小
        cancelgo.setBounds(250, 90, 110, 40);
        go.setBounds(130, 90, 110, 40);                             //设置位置及大小
        lineText.setBounds(10, 35, 350, 30);                        //设置位置及大小
        gotoframe.add(go);                                          //加入组件
        gotoframe.add(cancelgo);                                    //加入组件
        gotoframe.add(lineText);                                    //加入组件
        gotoframe.add(linenumber);                                  //加入组件
        gotoframe.setSize(400, 200);                                //定义窗体大小
        gotoframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
        //“字体”窗口
        script.setLayout(null);                  //定义排版
        jcbscript.setBorder(BorderFactory.createTitledBorder("字体"));
        jcbscript.addItemListener(this);         //加入选项监听
        jcbscript.addActionListener(this);       //加入动作监听
        jcbscript.setMaximumRowCount(14);        //最多显示14个选项
        jcbscript.setEditable(true);             //设置可编辑文本
        jcbscript.configureEditor(jcbscript.getEditor(), "微软雅黑");//定义默认值
        jcbscript.setBounds(10, 10, 200, 50);    //定义窗体位置及大小
        jcbglyph.setBorder(BorderFactory.createTitledBorder("字形"));
        jcbglyph.addItemListener(this);         //加入选项监听
        jcbglyph.addActionListener(this);       //加入动作监听
        jcbglyph.setMaximumRowCount(14);        //最多显示14个选项
        jcbglyph.setEditable(true);             //设置可编辑文本
        jcbglyph.configureEditor(jcbglyph.getEditor(), "常规");//定义默认值
        jcbglyph.setBounds(220, 10, 200, 50);    //定义窗体位置及大小
        jcbfontSize.setBorder(BorderFactory.createTitledBorder("大小"));
        jcbfontSize.setSelectedItem("20");         //定义默认选项,不能放在加入监听之后
        jcbfontSize.addItemListener(this);         //加入选项监听
        jcbfontSize.addActionListener(this);       //加入动作监听
        jcbfontSize.setMaximumRowCount(14);        //最多显示14个选项
        jcbfontSize.setEditable(true);             //设置可编辑文本
        jcbfontSize.configureEditor(jcbfontSize.getEditor(), "20");//定义默认值
        jcbfontSize.setBounds(430, 10, 150, 50);   //定义窗体位置及大小
        scrcancel.addActionListener(this);       //加入动作监听
        scrcancel.setBounds(450, 300, 60, 30);   //定义按钮位置及大小
        scrsave.addActionListener(this);
        scrsave.setBounds(380, 300, 60, 30);     //定义按钮位置及大小
        cont2.add(scrsave);                      //加入组件
        cont2.add(scrcancel);                    //加入组件
        cont2.add(jcbscript);                    //加入组件
        cont2.add(jcbglyph);                     //加入组件
        cont2.add(jcbfontSize);                  //加入组件
        script.setSize(600,400);                 //定义窗体大小
        script.setResizable(false);              //设置窗体能否改变大小
        script.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
        //“查找/替换”窗口
        dir = 8;                              //默认方向向前
        aA = true;                            //默认区分大小写
        lo = true;                            //默认循环
        findlab.addActionListener(this);      //加入菜单项监听
        replacelab.addActionListener(this);   //加入菜单项监听
        close.addActionListener(this);        //加入菜单项监听
        find.addActionListener(this);         //加入菜单项监听
        replace.addActionListener(this);      //加入菜单项监听
        finrep.addActionListener(this);       //加入菜单项监听
        allreplace.addActionListener(this);   //加入菜单项监听
        backoff.addItemListener(this);        //加入单选项监听
        forward.addItemListener(this);        //加入单选项监听
        sensitive.addItemListener(this);      //加入复选框监听
        loop.addItemListener(this);           //加入复选框监听
        Font fnt = new Font("微软雅黑",Font.PLAIN,15);//定义显示字体
        findframe.setLayout(null);                 //定义排版
        findLab.setFont(fnt);                      //设置标签的显示字体
        replaceLab.setFont(fnt);                   //设置标签的显示字体
        findLab.setBounds(10, 10, 100, 15);        //设置位置及大小
        findText.setBounds(100, 5, 300, 30);       //设置位置及大小
        find.setBounds(410, 5, 110, 30);           //设置位置及大小
        replaceLab.setBounds(10, 50, 100, 15);     //设置位置及大小
        replaceText.setBounds(100, 45, 300, 30);   //设置位置及大小
        replace.setBounds(410, 45, 110, 30);       //设置位置及大小
        allreplace.setBounds(410, 85, 110, 30);    //设置位置及大小
        close.setBounds(410, 165, 110, 30);        //设置位置及大小
        pandirection.setBounds(250, 85, 150, 70);  //设置位置及大小
        loop.setBounds(10, 130, 110, 30);          //设置位置及大小
        sensitive.setBounds(10, 155, 110, 30);     //设置位置及大小
        finrep.setBounds(410, 125, 110, 30);       //设置位置及大小
        findlab.setMnemonic('F');                  //设置快捷键F
        replacelab.setMnemonic('E');               //设置快捷键E
        forward.setMnemonic('O');                  //设置快捷键O
        backoff.setMnemonic('B');                  //设置快捷键B
        loop.setMnemonic('P');                     //设置快捷键P
        sensitive.setMnemonic('C');                //设置快捷键C
        find.setMnemonic('N');                     //设置快捷键N
        replace.setMnemonic('R');                  //设置快捷键R
        allreplace.setMnemonic('A');               //设置快捷键A
        finrep.setMnemonic('D');                   //设置快捷键D
        pandirection.setBorder(BorderFactory.createTitledBorder("方向"));
        pandirection.setLayout(new GridLayout(1,2));//定义排版,1行2列
        pandirection.add(forward);                //加入组件
        pandirection.add(backoff);                //加入组件
        direction.add(forward);                   //将前进单选按钮加入到方向按钮组中
        direction.add(backoff);                   //将后退单选按钮加入到方向按钮组中
        findframe.add(pandirection);              //加入面板
        findframe.add(findLab);                   //加入组件
        findframe.add(findText);                  //加入组件
        findframe.add(find);                      //加入组件
        findframe.add(replaceLab);                //加入组件
        findframe.add(replaceText);               //加入组件
        findframe.add(replace);                   //加入组件
        findframe.add(allreplace);                //加入组件
        findframe.add(close);                     //加入组件
        findframe.add(loop);                      //加入组件
        findframe.add(sensitive);                 //加入组件
        findframe.add(findlab);                   //加入组件
        findframe.add(replacelab);                //加入组件
        findframe.add(finrep);                    //加入组件
        findframe.setSize(540,240);               //定义窗体大小
        findframe.setResizable(false);            //设置窗体能否改变大小
        findframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
        //“颜色”窗口
        colorsave.addActionListener(this);        //加入按钮监听
        colorcancel.addActionListener(this);      //加入按钮监听
        typefacepan.add(typefacecolor);           //第一个面板加入一个调色板
        backgroundpan.add(backgroundcolor);       //第二个面板加入一个调色板
        tab.addTab("字体颜色",typefacepan);        //加入组件
        tab.addTab("背景颜色", backgroundpan);     //加入组件
        colorPan.add(colorsave);                   //加入组件
        colorsave.setMnemonic('Y');                //设置快捷键Y
        colorPan.add(colorcancel);                 //加入组件
        colorcancel.setMnemonic('N');              //设置快捷键N
        tbsplit.setDividerLocation(400);           //设置分隔条的位置
        tbsplit.setDividerSize(0);                 //设置分隔条大小
        colorcont.add(tbsplit);                    //加入组件
        colorframe.setSize(450,470);               //设置窗体大小
        colorframe.setResizable(false);            //设置窗体能否改变大小
        colorframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
        //文件
        fileChooser.addChoosableFileFilter(new FileNameExtensionFilter("文本文档(*.txt)", "txt"));//文件过滤器
//        fileChooser.setFileFilter(new FileNameExtensionFilter("文本文档(*.txt)", "txt"));         //同上
        fileChooser.setSelectedFile(new File("*.txt"));          // 设置打开文件选择框后默认输入的文件名
        
        //“关于记事本”窗口
        aboutframe.setLayout(new BorderLayout());
        aboutframe.add(lab,BorderLayout.WEST);                      //加入组件
        aboutframe.add(lab2,BorderLayout.CENTER);                   //加入组件
        aboutframe.getContentPane().setBackground(Color.WHITE);     //设置窗体的背景颜色
        aboutframe.getContentPane().setBackground(Color.RED);
        aboutframe.pack();                                          //设置窗体大小
        aboutframe.setResizable(false);                             //设置窗体能否改变大小
        aboutframe.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);//仅退出当前窗体
        
    }
    
    @Override
    public void actionPerformed(ActionEvent e) { //动作事件
        if(e.getSource()==windowItem){                           //判断触发源是否是提交新窗口按钮
            new Notepad();
        }else if(e.getSource()==exitItem){                             //判断触发源是否是提交退出按钮
            if(ischange||frame.getTitle().equals("无标题 - 记事本")&&zishu==0){
                windownum--;
                if(windownum==0){                                    //最后一个窗口退出就关闭系统
                    System.exit(0);
                }else
                frame.dispose();                                     //关闭窗口
            }else{
            ispass=3;
            isSave.setVisible(true);                             //跳出isSave窗体
            }
        }else if(e.getSource()==newItem){                              //判断触发源是否是提交新建按钮
            if(ischange||frame.getTitle().equals("无标题 - 记事本")&&zishu==0){
                windownum--;
                frame.dispose();                                 //关闭窗口
                new Notepad();
            }else{
                ispass=1;
                isSave.setVisible(true);                         //跳出isSave窗体
            }
        }else if(e.getSource()==dateItem){                             //判断触发源是否是提交日期时间按钮
            Calendar calendar = new GregorianCalendar();//声明一个Calendar对象,用于日期时间按键
            jta.append(calendar.get(Calendar.HOUR_OF_DAY)+":"+calendar.get(Calendar.MINUTE)+":"+calendar.get(Calendar.SECOND)+" "+calendar.get(Calendar.YEAR)+"/"+(calendar.get(Calendar.MONTH)+1)+"/"+calendar.get(Calendar.DAY_OF_MONTH));
        }else if(e.getSource()==nosave){                               //判断触发源是否是提交不保存按钮
            isSave.dispose();
            if(ispass==1){                                        //表示因新建按钮跳出的isSave保存窗体
                new Notepad();
                ispass=3;
            }
            if(ispass==2){                                  //表示因打开按钮跳出的isSave保存窗体
                this.jta.setText("");                          //清空文本中的原有内容
                fileChooser.setApproveButtonText("确定");      //定义确定按钮信息
                fileChooser.setDialogTitle("打开文件");        //设置文件选择框标题
                result = fileChooser.showOpenDialog(this.frame);//显示打开对话框
                if(result==JFileChooser.APPROVE_OPTION){       //表示选择了确定按钮
                    file = fileChooser.getSelectedFile();      //得到选择的File对象
                }else if(result==JFileChooser.CANCEL_OPTION){  //表示选择了取消按钮
                                                               //do nothing
                }else{//result==JFileCHooser.ERROR_OPTION      //出现错误  
                                                               //do nothing
                }
                if(file!=null){
                    try{
                        Scanner scan = new Scanner(
                                new FileInputStream(file));    //设置输入流
                        scan.useDelimiter("\n");               //设置换行分隔符
                        while(scan.hasNext()){                 //循环读取
                            this.jta.append(scan.next());      //读取内容到文本区
                        }
                        scan.close();                          //关闭
                        lastzishu=jta.getText().length();      //得到文本长度
                        ischange=true;
                    }catch(Exception ex){
                                                               //do nothing
                    }
                }
            }
            if(ispass==3){
                windownum--;
                if(windownum==0){                                    //最后一个窗口退出就关闭系统
                    System.exit(0);
                }else
                frame.dispose();
            }
        }else if(e.getSource()==cancel){                                 //判断触发源是否是提交取消按钮
            isSave.dispose();                                      //关闭窗口
        }else if(e.getSource()==typeface){                               //判断触发源是否是提交字体按钮
            script.setLocation(frame.getX()+100, frame.getY()+100);//定义窗体位置
            script.setVisible(true);                               //跳出字体窗口
        }else if(e.getSource()==scrcancel){                              //判断触发源是否是提交字体窗口中的取消按钮
            script.dispose();                                      //关闭窗口
        }else if(e.getSource()==scrsave){                                //字体窗口中的确定按钮监听
            boolean flag[]={true,true,true};
            String itemSize = (String)jcbfontSize.getSelectedItem();//得到选项
            int size = 20;                                          //定义默认值
            try{
                size = Integer.parseInt(itemSize);                  //字符串转整数
            }catch(Exception ex){
                jcbfontSize.getEditor().setItem("请输入数字");     //显示错误信息
                flag[0] = false;
            }
            String itemfont = (String)jcbscript.getSelectedItem();//得到选项
            flag[1] = false;
            for(int i=0;i<jcbscript.getItemCount();i++){          //循环判断
                if(itemfont.equals(jcbscript.getItemAt(i))){      //判断是否存在
                    flag[1] = true;                               //存在修改标志变量
                }
                if(i==jcbscript.getItemCount()-1&&flag[1] == false){
                    jcbscript.getEditor().setItem("没有该名称的字体");   //显示错误信息
                }
            }
            String itemglyph = (String)jcbglyph.getSelectedItem();//得到选项
            int glyph=0;                                      //定义默认值
            flag[2] = false;
            for(int i=0;i<jcbglyph.getItemCount();i++){       //循环判断
                if(itemglyph.equals(jcbglyph.getItemAt(i))){  //判断是否存在
                    switch(i){
                    case 0:glyph=0;break;                     //常规
                    case 1:glyph=1;break;                     //粗体
                    case 2:glyph=2;break;                     //倾斜
                    case 3:glyph=3;break;                     //粗体倾斜
                    }
                    flag[2] = true;                           //存在修改标志变量
                }
                if(i==jcbglyph.getItemCount()-1&&flag[2] == false){
                    jcbglyph.getEditor().setItem("没有该名称的字形");   //显示错误信息
                }
            }
            if(flag[0]==true&&flag[1]==true&&flag[2]==true){
                jta.setFont(new Font(itemfont,glyph,size));   //定义显示字体
                fontsize=size;
                script.dispose();                             //关闭窗口
            }
        }else if(e.getSource()==osaveItem||e.getSource()==save||e.getSource()==saveItem){      //判断触发源是否是提交保存按钮
            isSave.dispose();
            if(frame.getTitle().equals("无标题 - 记事本")||e.getSource()==osaveItem){
            fileChooser.setDialogTitle("另存为");        //设置文件选择框标题
            result = fileChooser.showSaveDialog(this.frame);   //显示保存文件框
            }else{
                if(file!=null){
                    try{
                        PrintStream out = new PrintStream(           //实例化打印流对象
                                new FileOutputStream(file));
                        out.print(this.jta.getText());            //输出全部内容
                        out.close();                              //关闭输出流
                        lastzishu=jta.getText().length();      //得到文本长度
                        ischange=true;
                    }catch(Exception ex){                         //文件保存失败
                                                                  //do nothing
                    }
                }
                frame.setTitle(file.getName()+" - 记事本");    //更改frame窗口标题
                if(ispass==1){                                 //因新建导致的isSave窗口跳出
                    new Notepad();
                    ispass=3;
                }
                if(ispass==2){                                  //表示因打开按钮跳出的isSave保存窗体
                    this.jta.setText("");                          //清空文本中的原有内容
                    fileChooser.setApproveButtonText("确定");      //定义确定按钮信息
                    fileChooser.setDialogTitle("打开文件");        //设置文件选择框标题
                    result = fileChooser.showOpenDialog(this.frame);//显示打开对话框
                    if(result==JFileChooser.APPROVE_OPTION){       //表示选择了确定按钮
                        file = fileChooser.getSelectedFile();      //得到选择的File对象
                    }else if(result==JFileChooser.CANCEL_OPTION){  //表示选择了取消按钮
                                                                   //do nothing
                    }else{//result==JFileCHooser.ERROR_OPTION      //出现错误  
                                                                   //do nothing
                    }
                    if(file!=null){
                        try{
                            Scanner scan = new Scanner(
                                    new FileInputStream(file));    //设置输入流
                            scan.useDelimiter("\n");               //设置换行分隔符
                            while(scan.hasNext()){                 //循环读取
                                this.jta.append(scan.next());      //读取内容到文本区
                            }
                            scan.close();                          //关闭
                            lastzishu=jta.getText().length();      //得到文本长度
                            ischange=true;
                        }catch(Exception ex){
                                                                   //do nothing
                        }
                    }
                }
                if(ispass==3){
                    windownum--;
                    if(windownum==0){                                    //最后一个窗口退出就关闭系统
                        System.exit(0);
                    }else
                    frame.dispose();
                }
            }
            if(result==JFileChooser.APPROVE_OPTION){           //判断是否选择的是保存
                file = fileChooser.getSelectedFile();          //选择要保存的文件
                if(file!=null){
                    try{
                        PrintStream out = new PrintStream(           //实例化打印流对象
                                new FileOutputStream(file));
                        out.print(this.jta.getText());            //输出全部内容
                        out.close();                              //关闭输出流
                        lastzishu=jta.getText().length();      //得到文本长度
                        ischange=true;
                    }catch(Exception ex){                         //文件保存失败
                                                                  //do nothing
                    }
                }
                frame.setTitle(file.getName()+" - 记事本");    //更改frame窗口标题
                if(ispass==1){                                 //因新建导致的isSave窗口跳出
                    new Notepad();
                    ispass=3;
                }
                if(ispass==2){                                  //表示因打开按钮跳出的isSave保存窗体
                    this.jta.setText("");                          //清空文本中的原有内容
                    fileChooser.setApproveButtonText("确定");      //定义确定按钮信息
                    fileChooser.setDialogTitle("打开文件");        //设置文件选择框标题
                    result = fileChooser.showOpenDialog(this.frame);//显示打开对话框
                    if(result==JFileChooser.APPROVE_OPTION){       //表示选择了确定按钮
                        file = fileChooser.getSelectedFile();      //得到选择的File对象
                    }else if(result==JFileChooser.CANCEL_OPTION){  //表示选择了取消按钮
                                                                   //do nothing
                    }else{//result==JFileCHooser.ERROR_OPTION      //出现错误  
                                                                   //do nothing
                    }
                    if(file!=null){
                        try{
                            Scanner scan = new Scanner(
                                    new FileInputStream(file));    //设置输入流
                            scan.useDelimiter("\n");               //设置换行分隔符
                            while(scan.hasNext()){                 //循环读取
                                this.jta.append(scan.next());      //读取内容到文本区
                            }
                            scan.close();                          //关闭
                            lastzishu=jta.getText().length();      //得到文本长度
                            ischange=true;
                        }catch(Exception ex){
                                                                   //do nothing
                        }
                    }
                }
                if(ispass==3){
                    windownum--;
                    if(windownum==0){                                    //最后一个窗口退出就关闭系统
                        System.exit(0);
                    }else
                    frame.dispose();
                }
            }else if(result==JFileChooser.CANCEL_OPTION){      //判断是否取消
                //do nothing
            }else{//result==JFileChooser.ERROR_OPTION          //操作出现错误
                
            }
        }else if(e.getSource()==openItem){
            if(ischange||frame.getTitle().equals("无标题 - 记事本")&&zishu==0){
                this.jta.setText("");                          //清空文本中的原有内容
                fileChooser.setApproveButtonText("确定");      //定义确定按钮信息
                fileChooser.setDialogTitle("打开文件");        //设置文件选择框标题
                result = fileChooser.showOpenDialog(this.frame);//显示打开对话框
                if(result==JFileChooser.APPROVE_OPTION){       //表示选择了确定按钮
                    file = fileChooser.getSelectedFile();      //得到选择的File对象
                }else if(result==JFileChooser.CANCEL_OPTION){  //表示选择了取消按钮
                                                               //do nothing
                }else{//result==JFileCHooser.ERROR_OPTION      //出现错误  
                                                               //do nothing
                }
                if(file!=null){
                    frame.setTitle(file.getName()+" - 记事本");  //更改frame窗口标题
                    try{
                        Scanner scan = new Scanner(
                                new FileInputStream(file));    //设置输入流
                        scan.useDelimiter("\n");               //设置换行分隔符
                        while(scan.hasNext()){                 //循环读取
                            this.jta.append(scan.next());      //读取内容到文本区
                        }
                        scan.close();                          //关闭
                        lastzishu=jta.getText().length();      //得到文本长度
                        ischange=true;
                    }catch(Exception ex){
                                                               //do nothing
                    }
                }
            }else{
                ispass=2;
                isSave.setVisible(true);                       //跳出isSave窗口
            }
        }else if(e.getSource()==revokeItem){                         //撤销按钮
            if(undo.canUndo()){
                undo.undo();
            }
        }else if(e.getSource()==recovery){                //恢复按钮
            if(undo.canRedo()){
                undo.redo();
            }
        }else if(e.getSource()==enlargeItem){                //放大按钮
            Font f = jta.getFont(); 
            jta.setFont(new Font(f.getName(),f.getStyle(),f.getSize()+1)); 
        }else if(e.getSource()==narrowItem){                 //缩小按钮
            Font f = jta.getFont(); 
            jta.setFont(new Font(f.getName(),f.getStyle(),f.getSize()-1));
        }else if(e.getSource()==recoveryItem){               //恢复缩放按钮
            Font f = jta.getFont();
            jta.setFont(new Font(f.getName(),f.getStyle(),fontsize));
        }else if(e.getSource()==findreplace){             //查找/替换按钮
            findframe.setLocation(frame.getX()+100, frame.getY()+300);//定义窗体位置
            findframe.setVisible(true);
        }else if(e.getSource()==findlab){
            findText.requestFocus();                   //获取焦点
            findText.selectAll();                      //全选
        }else if(e.getSource()==replacelab){
            replaceText.requestFocus();                //获取焦点
            replaceText.selectAll();                   //全选
        }else if(e.getSource()==close){                //查找窗口中的关闭按钮
            findframe.dispose();
        }else if(e.getSource()==find||e.getSource()==finrep) {                //查找窗口中的查找按钮
                String text=jta.getText();                   //获取文本内容
                String word=findText.getText();              //获取查找文本框中的内容
                if(aA==false){                               //不区分大小写
                    text=text.toUpperCase();                 //将文本和待查找文本都转化为大写
                    word=word.toUpperCase();
                }
                int first = 0;
                if(dir==8){                                  //查找方向为向前
                    first = text.indexOf(word,jta.getCaretPosition());//得到光标之后的第一个word的位置
                }else{                                       //查找方向为向后
                    first = text.lastIndexOf(word,jta.getCaretPosition()-word.length()-1);//得到光标之前的第一个word的位置
                }
                if(first==-1){                               //没找到word
                    java.awt.Toolkit.getDefaultToolkit().beep();//发出提示音
                    if(lo==false){                           //不循环
                        first=next-word.length();
                    }else{                                   //循环
                        if(dir==8){
                            first = text.indexOf(word);          //得到文本第一个word的位置
                        }else{
                            first = text.lastIndexOf(word);      //得到文本最后一个word的位置
                        }
                        if(first==-1){
                            JOptionPane.showMessageDialog(null, "找不到 \""+word+"\"");
                        }
                    }
                }
                int end = first+word.length();               //得到word末尾的位置
                next = end;
                head = first;
                jta.select(first, end);                      //选中word
                if(e.getSource()==finrep&&first!=-1){
                    String word1=replaceText.getText();               //获取替换文本框中的内容
                    jta.replaceSelection(word1);                      //替换选中的文本
                    jta.select(head, head+word1.length());            //选中替换后的word
                }
        }else if(e.getSource()==replace){
            String word=replaceText.getText();               //获取替换文本框中的内容
            jta.replaceSelection(word);                      //替换选中的文本
            jta.select(head, head+word.length());            //选中替换后的word
        }else if(e.getSource()==allreplace){
            String text = jta.getText();                     //获取文本内容
            String wordfind = findText.getText();            //获取查找文本框中的内容
            String wordrep= replaceText.getText();           //获取替换文本框中的内容
            if(aA==false){                                   //不区分大小写
                text = text.toUpperCase();                   //将文本和待查找文本都转化为大写
                wordfind = wordfind.toUpperCase();
            }
            jta.selectAll();                                      //全选
            jta.replaceSelection(text.replace(wordfind, wordrep));//替换
        }else if(e.getSource()==gotoItem){
            gotoframe.setLocation(frame.getX()+10, frame.getY()+65);
            gotoframe.setVisible(true);
        }else if(e.getSource()==go){
            boolean judge=true;                                     //判断:是否满足条件
            int size = 0;                                           //定义默认值
            try{
                size = Integer.parseInt(lineText.getText());        //字符串转整数
            }catch(Exception ex){
                lineText.setText("请输入数字");                      //显示错误信息
                judge = false;
            }
            if(judge){
                try {
                    jta.setCaretPosition(jta.getLineStartOffset(size-1));//设置光标位置至第size行
                    gotoframe.dispose();                                 //关闭窗口
                } catch (BadLocationException e1) {
                    JOptionPane.showMessageDialog(null, "行数超过了总行数");//跳出消息提示框
                }
            }
        }else if(e.getSource()==cancelgo){                           //取消转到行
            gotoframe.dispose();                                     //关闭窗口
        }else if(e.getSource()==aboutItem){                          //关于记事本选项
            aboutframe.setLocation(frame.getX()+200, frame.getY()+200);
            aboutframe.setVisible(true);
        }else if(e.getSource()==colorItem){                          //颜色选项
            colorframe.setLocation(frame.getX()+300, frame.getY()+100);
            colorframe.setVisible(true);
        }else if(e.getSource()==colorsave){                          //使用当前颜色按钮
            jta.setForeground(typefacecolor.getColor());
            jta.setBackground(backgroundcolor.getColor());
        }else if(e.getSource()==colorcancel){                        //恢复默认颜色按钮
            jta.setForeground(Color.BLACK);
            jta.setBackground(Color.WHITE);
        }
    }

    @Override
    public   void   caretUpdate(CaretEvent   e) //光标事件
    { 
        try 
        {
            zishu=jta.getText().length();
            pos   =   jta.getCaretPosition(); 
                //获取行数 
            lineOfC   =   jta.getLineOfOffset(pos)   +   1; 
                //获取列数 
            col   =   pos   -   jta.getLineStartOffset(lineOfC   -   1)   +   1; 
              hanglie.setText("字符数:"+zishu+ "          当前光标位置:第"+lineOfC+"行,第"+col+"列");
              if(zishu!=lastzishu){
                  ischange=false;
              }
          } 
          catch(Exception   ex) 
          { 
                hanglie.setText( "无法获得当前光标位置 "); 
          } 
    }

    @Override
    public void itemStateChanged(ItemEvent e) {     //JCheckBox事件、单选事件
        JCheckBox jcb = null;
        if(e.getSource() instanceof JCheckBox){     //JCheckBox事件才需要转型
        jcb= (JCheckBox)e.getItem();
        }
        if(e.getSource()==linewrap){
            if(jcb.isSelected()){
                jta.setLineWrap(true);              //设置自动换行
            }else{
                jta.setLineWrap(false);             //设置不自动换行
            }
        }else if(e.getSource()==orderItem){
            if(jcb.isSelected()){
                jta.setComponentOrientation(ComponentOrientation.RIGHT_TO_LEFT);//设置组件显示方向为从右到左
            }else{
                jta.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT);//设置组件显示方向为从左到右
            }
            //以下是为了直接改变显示方向
            jta.append("1");
            if(undo.canUndo()){
                undo.undo();
            }
        }else if(e.getSource()==statusItem){
            if(jcb.isSelected()){
                hanglie.setVisible(true);           //状态栏显示
            }else{
                hanglie.setVisible(false);          //状态栏不显示
            }
        }else if(e.getSource()==sensitive){
            if(jcb.isSelected()){
                aA = true;                          //区分大小写
            }else{
                aA = false;                         //不区分大小写
            }
        }else if(e.getSource()==loop){
            if(jcb.isSelected()){
                lo = true;                           //循环
            }else{
                lo = false;                          //不循环
            }
        }else if(e.getSource()==forward){
            if(forward.isSelected()){               //向前被选中
                dir = 8;                            //方向为向前
            }else{                                  //向后被选中
                dir = 2;                            //方向为向后
            }
        }
    }

    @Override
    public void mouseWheelMoved(MouseWheelEvent e) {   //鼠标滚轮监听器
        if(e.isControlDown()){//当ctrl键被按下,滚动为放大缩小 
            Font f = jta.getFont(); 
            if(e.getWheelRotation()<0){//如果滚动条向前就放大文本 
              jta.setFont(new Font(f.getFamily(),f.getStyle(),f.getSize()+1)); 
            }else if(e.getWheelRotation()>0){//滚动条向后就缩小文本 
              jta.setFont(new Font(f.getFamily(),f.getStyle(),f.getSize()-1)); 
            }
          }else{//当ctrl没有被按下,则为系统滚动
            scr.addMouseWheelListener(sysWheel); 
            sysWheel.mouseWheelMoved(e);//触发系统滚动事件。 
            scr.removeMouseWheelListener(sysWheel); 
          }
        
    }
 
}

 

 

Main类

 

public class Main{

    public static void main(String[] args) {

        new Notepad();

    }

}

 

 

4.2        界面设计

 

(1) 记事本主界面模块

 

用户在记事本主界面选择相应的功能,查看编辑文本。记事本主界面如下图4-5所示。

 

 

 

 

 

图4-5 记事本主界面

 

  

 

(2)查找/替换模块

 

用户在查找/替换界面输入查找内容、替换内容,选择查找、替换功能。查找/替换界面:如下图4-6-1所示。

 

 

 

 

 

 

图4-6-1查找/替换界面

 

 

 

(3)   转到指定行模块

 

用户在转到指定行界面可以输入指定行,使光标转到指定行。如下图4-7所示。

 

 

 

 

 

 

图4-7转到指定行界面

 

 

 

(4)   字体模块

 

用户在字体界面可以更改字体样式、字形、字号;如下图4-8所示。

 

 

 

 

 

 

图4-8字体界面

 

(5)   颜色选择模块

 

用户在颜色选择界面可以进行颜色选择;如下图4-9所示。

 

 

 

 

 

 

 图4-9

 

 

 

(6)是否保存对话框模块

 

用户在是否保存对话框界面选择是否保存;如下图 4-10 所示。

 

 

 

 

 

 

图4-10 是否保存对话框界面

 

 

 

(7) 文件选择模块

 

       用户在文件选择界面选择文件路径。如下图4-11所示。

 

 

 

 

 

 

图4-11 另存为界面

 

 

5.    实施概况

 

5.1        程序测试

 

5.1.1 对新建功能进行测试

 

         测试结果:文本被更改点击新建跳出了是否保存对话框,处理完是否保存对话框后退出了当前记事本,新建记事本成功。

 

 

 

 

 

 

5.1.2 对新窗口功能进行测试

 

                测试结果:成功创建新记事本窗口。

 

 

 

 

 

 

5.1.3 对保存功能进行测试

 

                测试结果: 文本被保存过实现了直接保存到原有文件,文件未被保存过跳出了另存为窗口。

 

 

 

5.1.4对另存为功能进行测试

 

         测试结果:文本成功保存到了选定路径下。

 

5.1.5对打开功能进行测试

 

               测试结果:文本被更改点击打开跳出了是否保存对话框,处理完是否保存对话框后跳出了文本选择框,成功打开了文本。

 

 

 

 

       5.1.6对退出功能进行测试

 

                测试结果:文本被更改点击退出跳出了是否保存对话框,处理完是否保存对话框后退出了当前记事本窗口,其他记事本窗口正常。

 

 

 

       5.1.7对撤销/恢复功能进行测试

 

                测试结果:实现了文本的撤销与恢复。

 

5.1.8对查找/替换功能进行测试

 

                测试结果:成功查找到指定内容、成功替换为指定内容。未找到指定内容时跳出了提示框。

 

 

 

 

 

 

 

 

 

 

 

 

5.1.9对转到功能进行测试

 

                测试结果:成功转到指定行。输入非数字字符有提示,超过总行数时提出了提示框。

 

 

 

 

 

 

 

 

 

5.1.10对时间/日期功能进行测试

 

           测试结果:时间/日期追加成功。

 

 

 

 

 

 

5.1.11对从左到右的阅读顺序功能进行测试

 

          测试结果:

 

 

 

5.1.12对自动换行功能进行测试

 

          测试结果:实现了自动换行。

 

 

 

5.1.13对字体功能进行测试

 

          测试结果:字体更改成功,对非法输入值有提示。

 

 

 

 

 

 

 

5.1.14对缩放功能进行测试

 

          测试结果:成功实现放大缩小,一键恢复默认缩放。

 

 

 

5.1.15对状态栏功能进行测试

 

          测试结果:状态栏显示字符数正确,显示光标所在行列数正确,实现了选择不显示状态栏。

 

 

 

 

 

 

 

5.1.16对颜色功能进行测试

 

          测试结果:成功更改了字体和背景颜色,恢复默认颜色成功。

 

 

 

 

 

结论

 

 

 

紧张愉快的课程设计结束了,本人通过努力实现了一个记事本程序。本程序提供了一些基本的人性化功能,要提供功能非常强大的办公软件,还需要进一步地考查调研。所有可能实现的功能都将会在今后的工作中继续分析、设计、逐步实现,力求使本记事本程序更加完善。

 

在开发过程中,本人本着将所学的理论知识应用于实践的思想,开发出高质量程序的目的,进行了详细的研究,细致耐心的开发与设计,以实事求是的态度开发出本记事本程序。最重要的是通过开发与设计,锻炼了我们分析问题以及进行合理规划与分析设计的能力,同时对开发工具的使用能力也有大幅度提高。我们将所学的理论知识结合到了实际的应用中去,实际的动手能力也有明显的提升。当然,由于自身学识尚浅,经验不足,程序的功能也有一些缺陷。

 

虽然记事本程序仍有许多待解决的问题和待完善的地方,但相信通过本人的不断努力、继续学习,必定会让该程序更加完美。这次开发过程中所学到的所有知识,将成为本人今后学习工作当中的坚实基础。希望以后还会有这种锻炼自己的实践机会。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

致  谢

 

 

 

我在李津老师的悉心指导下,圆满完成了本次课程设计。在记事本程序的开发过程中,得到了指导老师的细心指导。在开发的过程中遇到了很多问题通过与老师一起研讨,帮助我进行调研和分析,耐心地指导我进行开发和解决问题。在他的帮助下我不断进步并自我提高。在此过程中,对于我遇到的所有问题和困难,老师都给予了细心的解答和真诚的帮助,在此表示衷心的感谢。

 

在这里我还要感谢我的同学,在开发过程中,我很高兴能在这样有凝聚力和好学上进的氛围中学习和工作,是大家的支持和帮助让我的本次程序设计能够顺利完成!

 

此外,我们的程序设计课题得以很好的完成,这和学校为我们提供的良好的学习环境,以及设计过程给予我支持和帮助的计算机系各位老师是分不开的,特此向他们表示衷心的感谢!

 

还要感谢那些网上不知名的网友的经验,如果不是他们的分享,我的记事本程序也不可能完成的这么快。

 

在此,我向所有帮助过我的老师、同学和朋友们表达美好的祝福。祝愿大家在今后的日子里,工作顺利,更进一步!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

课程总结:

老师以较快的速度讲解了JDBC,所以我只是大概了解,还需要按照课本加以网络的指导完成数据库的安装和基础使用操作。

 

常用SQL操作命令符

insertdeleteupdateselect

 update 更新   alter  改变

     

创建数据库          create database 数据库;

查看指定数据库   show create database 数据库;

查看数据库(所有的) show databases;

修改数据库编码    alter database 数据库 default character set  新编码方式 collate 新编码方式_bin;

使用数据库          use db

删除数据库          drop database 数据库;(不能一次删除多个!)

     

创建表                 create table 表名(列名数据类型 [not null] [primary key],列名数据类型 [not null],..) 

查看所有表           show tables

查看一个表数据     select * from 表名        *代表所有列  也可以select  列名 from 表名

删除表                 drop table 表名

更改表名              rename table 旧表名 to 新表名

     

增加表内容插入数据     insert  into  表名(列名,列名...values(值,值...

修改列中的一条记录      update  表名  set   =   where   =   

删除列中的一条记录      delete  from  表名   where   =  

     

增加一个列                  Alter table 表名 add 列名数据类型

删除一个列                  Alter table 表名 drop column 列名 

修改一个列名              Alter table  表名 change 列名  新列名数据类型;

     

desc 降序排列

asc   升序排列

     

delete 删除记录  结构依然存在   即还可以找到   执行后有提交过程

drop   结构和数据都删除     一步操作完成

MySQL基本数据类型

 

posted @ 2019-11-29 15:12  hlywww  Views(237)  Comments(5Edit  收藏  举报