求写JAVA程序并做分析

用Java实现一个简单记事本的功能,菜单要求齐全,但不必全部实现功能。需要实现的主要是“文件”菜单中的“新建”,“打开”,“保存”和“退出”功能即可。快捷键的功能可以忽略。(写出代码并做六百字左右解释分析,并不需要太专业的讲解,最好今天能做出来)

 

java 记事本及其简单功能的实现其中包括保存、新建、等功能的实现。

import java.awt.*;  
import java.awt.event.*;  
import java.text.*;  
import java.util.*;  
import java.io.*;  
import javax.swing.undo.*;

import javafx.scene.input.InputEvent;
import javafx.scene.input.KeyEvent;

import javax.swing.border.*;  
import javax.swing.*;  
import javax.swing.text.*;  
import javax.swing.event.*;  
import java.awt.datatransfer.*;
import java.time.*;   
public class Mynote extends JFrame implements ActionListener,DocumentListener{
    JMenuBar bar;
    JMenu cai1,cai2,cai3,cai4,cai5,cai41;
    JMenuItem cai11,cai12,cai13,cai14,cai15,cai16,cai17,cai18,cai21,cai22,cai23,cai24,cai25,cai26,cai27,cai28,cai29,cai210,cai211,cai212,cai213,cai32,cai33,cai34,cai42,cai41_1,cai41_2,cai41_3,cai51,cai52,cai53,editMenu_Undo;
    JTextArea text;
    JPanel pa;
    JScrollPane jsc;
    FileReader fr;
    BufferedReader br;
    FileWriter fw,fw1;
    BufferedWriter bw,bw1,out;
    String str=null,oldValue;
    File dir,currentFile,bcwjm;//currentFile当前文件名
    JFileChooser jfc2;
    JLabel label;
    JCheckBoxMenuItem cai31;
    //右键菜单项
    JPopupMenu youcd;
    JMenuItem cx,jq,fz,zt,sc,qx;
    //系统剪切板
    Toolkit toolkit=Toolkit.getDefaultToolkit();  
    Clipboard clipBoard=toolkit.getSystemClipboard();
    //设置图标
    ImageIcon image;
    //撤销操作
    protected UndoManager undo=new UndoManager();
    protected UndoableEditListener undoHandler=new UndoHandler();
    //判断是否是新文件
    boolean isNewFile=true;
    int a=0,b=0;
    public Mynote() {
        initGUI();
        this.setBounds(500,300,600,400);
        this.setVisible(true);
        setDefaultCloseOperation(3);
        this.setTitle("霖霖的记事本");
        //改字体
        Font ft = new Font("华文楷体",Font.PLAIN,14);
        java.util.Enumeration keys = UIManager.getDefaults().keys();  
        while (keys.hasMoreElements()) {  
            Object key = keys.nextElement();  
            Object value = UIManager.get(key);  
            if (value instanceof javax.swing.plaf.FontUIResource) {  
                UIManager.put(key, ft);  
            }  
        }
        //撤销
        label = new JLabel("按F1查看帮助");
        this.add(label,BorderLayout.SOUTH);
        //添加左上角图片
        image = new ImageIcon("my.jfif");
        this.setIconImage(image.getImage());
        //添加窗口侦听器
        addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                exitWindowChoose();
            }
        });
                
        checkMenuItemEnabled();
        text.requestFocus();
    }
    public void initGUI(){
        bar = new JMenuBar();
        cai1 = new JMenu("文件(F)");
        cai1.setMnemonic('F');//设置快捷键ALT+F
        cai2 = new JMenu("编辑(N)");
        cai2.setMnemonic('N');
        cai3 = new JMenu("格式(O)");
        cai3.setMnemonic('O');
        cai4 = new JMenu("查看(V)");
        cai4.setMnemonic('V');
        cai5 = new JMenu("帮助(H)");
        cai5.setMnemonic('H');

        cai11 = new JMenuItem("新建(N)");
        cai11.setAccelerator(KeyStroke.getKeyStroke(78,2));
        cai11.addActionListener(this);
        cai12 = new JMenuItem("新窗口(W)");
        cai12.addActionListener(this);
        cai13 = new JMenuItem("打开(O)");
        cai13.setAccelerator(KeyStroke.getKeyStroke(79,2));
        cai13.addActionListener(this);
        cai14 = new JMenuItem("保存(S)");
        cai14.setAccelerator(KeyStroke.getKeyStroke(83,2));
        cai14.addActionListener(this);
        cai15 = new JMenuItem("另存为(A)");
        cai15.addActionListener(this);
        cai16 = new JMenuItem("页面设置(U)");
        cai16.addActionListener(this);
        cai17 = new JMenuItem("打印(P)");
        cai17.addActionListener(this);
        cai18 = new JMenuItem("退出(X)");
        cai18.addActionListener(this);

        cai21 = new JMenuItem("撤销(U)");
        cai21.setAccelerator(KeyStroke.getKeyStroke(90,2));
        cai21.addActionListener(this);
        cai21.setEnabled(false);
        cai22 = new JMenuItem("剪切(T)");
        cai22.setAccelerator(KeyStroke.getKeyStroke(88,2));
        cai22.addActionListener(this);
        cai23 = new JMenuItem("复制(C)");
        cai23.setAccelerator(KeyStroke.getKeyStroke(67,2));
        cai23.addActionListener(this);
        cai24 = new JMenuItem("粘贴(P)");
        cai24.setAccelerator(KeyStroke.getKeyStroke(86,2));
        cai24.addActionListener(this);
        cai25 = new JMenuItem("删除(L)");
        cai25.setAccelerator(KeyStroke.getKeyStroke(127,0));
        cai25.addActionListener(this);
        cai26 = new JMenuItem("使用 Bing 搜索...");
        cai26.addActionListener(this);
        cai27 = new JMenuItem("查找(F)");
        cai27.addActionListener(this);
        cai28 = new JMenuItem("查找上一个(N)");
        cai28.addActionListener(this);
        cai29 = new JMenuItem("查找下一个(V)");
        cai29.addActionListener(this);
        cai210 = new JMenuItem("替换(R)...");
        cai210.addActionListener(this);
        cai211 = new JMenuItem("(转到G)...");
        cai211.addActionListener(this);
        cai212 = new JMenuItem("全选(A)");
        cai212.setAccelerator(KeyStroke.getKeyStroke(65, 2));
        cai212.addActionListener(this);
        cai213 = new JMenuItem("时间/日期(D)");
        cai213.setAccelerator(KeyStroke.getKeyStroke(116,0));
        cai213.addActionListener(this);

        cai31 = new JCheckBoxMenuItem("自动换行(W)");
        cai31.setMnemonic('W');
        cai31.setState(true);
        cai31.addActionListener(this);
        cai32 = new JMenuItem("字体(F)");
        cai32.addActionListener(this);
        cai33 = new JMenuItem("前景色");
        cai33.addActionListener(this);
        cai34 = new JMenuItem("背景色");
        cai34.addActionListener(this);

        cai41 = new JMenu("缩放(Z)");
        cai41.addActionListener(this);
        cai42 = new JMenuItem("状态栏(S)");
        cai42.addActionListener(this);
        cai41_1 = new JMenuItem("放大(I)");
        cai41_1.addActionListener(this);
        cai41_2 = new JMenuItem("缩小(O)");
        cai41_2.addActionListener(this);
        cai41_3 = new JMenuItem("恢复默认缩放(O)");
        cai41_3.addActionListener(this);

        cai51 = new JMenuItem("查看帮助(H)");
        cai51.setAccelerator(KeyStroke.getKeyStroke(112,0));
        cai51.addActionListener(this);
        cai52 = new JMenuItem("发送反馈(F)");
        cai52.addActionListener(this);
        cai53 = new JMenuItem("关于记事本(A)");
        cai53.addActionListener(this);

        cai1.add(cai11);
        cai1.add(cai12);
        cai1.add(cai13);
        cai1.add(cai14);
        cai1.add(cai15);
        cai1.add(cai16);
        cai1.add(cai17);
        cai1.add(cai18);

        cai2.add(cai21);
        cai2.add(cai22);
        cai2.add(cai23);
        cai2.add(cai24);
        cai2.add(cai25);
        cai2.add(cai26);
        cai2.add(cai27);
        cai2.add(cai28);
        cai2.add(cai29);
        cai2.add(cai210);
        cai2.add(cai211);
        cai2.add(cai212);
        cai2.add(cai213);

        cai3.add(cai31);
        cai3.add(cai32);
        cai3.add(cai33);
        cai3.add(cai34);

        
        cai41.add(cai41_1);
        cai41.add(cai41_2);
        cai41.add(cai41_3);
        cai4.add(cai41);
        cai4.add(cai42);

        cai5.add(cai51);
        cai5.add(cai52);
        cai5.add(cai53);
        bar.add(cai1);
        bar.add(cai2);
        bar.add(cai3);
        bar.add(cai4);
        bar.add(cai5);
        this.setJMenuBar(bar);

        text = new JTextArea(16,19);
        Font font = new Font("微软雅黑",Font.BOLD,20);
        text.setFont(font);
        text.setEnabled(true);

        //编辑区注册事件监听(与撤销操作有关)  
        text.getDocument().addUndoableEditListener(undoHandler);  
        text.getDocument().addDocumentListener(this);
        //创建右键菜单
        youcd = new JPopupMenu();  
        cx = new JMenuItem("撤销(U)");  
        jq = new JMenuItem("剪切(T)");  
        fz = new JMenuItem("复制(C)");  
        zt = new JMenuItem("粘帖(P)");  
        sc = new JMenuItem("删除(D)");  
        qx = new JMenuItem("全选(A)");
        
        cx.setEnabled(false);

        youcd.add(cx);  
        youcd.addSeparator();  
        youcd.add(jq);  
        youcd.add(fz);  
        youcd.add(zt);  
        youcd.add(sc);  
        youcd.addSeparator();  
        youcd.add(qx);

        cx.addActionListener(this);  
        jq.addActionListener(this);  
        fz.addActionListener(this);  
        zt.addActionListener(this);  
        sc.addActionListener(this);  
        qx.addActionListener(this);
        //创建编辑菜单及菜单项并注册事件监听 
        text.addMouseListener(new MouseAdapter()  
        {   public void mousePressed(MouseEvent e)  
            {   if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件  
                {   youcd.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单  
                }  
                checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性  
                text.requestFocus();//编辑区获取焦点  
            }  
            public void mouseReleased(MouseEvent e)  
            {   if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件  
                {   youcd.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单  
                }  
                checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性  
                text.requestFocus();//编辑区获取焦点  
            }  
        });
        pa = new JPanel();
        BorderLayout grid = new BorderLayout();
        pa.setLayout(grid);
        //设置光标可用性为true
        text.getCaret().setVisible(true);
        //设置光标位置为文本最后面
        text.setCaretPosition(text.getText().length()); 
        if(text.getText().equals("输入用户名")){
            text.setText("");
        }
        else//全选文本框
            text.selectAll();
        pa.add(text);
        //JScorllPane添加滚动条
        jsc = new JScrollPane(text);
        pa.add(jsc);
        //获取原文内容方便比较
        oldValue=text.getText();
        this.add(pa);
        cai2.addMenuListener(new MenuListener(){
            public void menuCanceled(MenuEvent e)//取消菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
            public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
            public void menuSelected(MenuEvent e)//选择某个菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
        });
    }
    //设置复制、粘贴等功能的可用性
    public void checkMenuItemEnabled()  
    {   String selectText=text.getSelectedText();  
        if(selectText==null)  
        {   cai22.setEnabled(false);   
            cai23.setEnabled(false); 
            cai25.setEnabled(false); 
            fz.setEnabled(false);
            zt.setEnabled(false);
            jq.setEnabled(false);
        }  
        else  
        {   cai22.setEnabled(true);
            cai23.setEnabled(true);    
            cai25.setEnabled(true);
            fz.setEnabled(true);
            zt.setEnabled(true);
            jq.setEnabled(true);   
        }  
        //粘帖功能可用性判断  
        Transferable contents=clipBoard.getContents(this);  
        if(contents==null){
            cai24.setEnabled(false);
            zt.setEnabled(false);
        }   
        else  
        {   cai24.setEnabled(true);
            zt.setEnabled(true);
        }  
    }
    public void font()  
    {   final JDialog fontDialog=new JDialog(this,"字体设置",false);  
        Container con=fontDialog.getContentPane();  
        con.setLayout(new FlowLayout(FlowLayout.LEFT));  
        JLabel fontLabel=new JLabel("字体(F):");  
        fontLabel.setPreferredSize(new Dimension(100,20));//构造一个Dimension,并将其初始化为指定宽度和高度  
        JLabel styleLabel=new JLabel("字形(Y):");  
        styleLabel.setPreferredSize(new Dimension(100,20));  
        JLabel sizeLabel=new JLabel("大小(S):");  
        sizeLabel.setPreferredSize(new Dimension(100,20));  
        final JLabel sample=new JLabel("张选仲的记事本-ZXZ's Notepad");  
        //sample.setHorizontalAlignment(SwingConstants.CENTER);  
        final JTextField fontText=new JTextField(9);  
        fontText.setPreferredSize(new Dimension(200,20));  
        final JTextField styleText=new JTextField(8);  
        styleText.setPreferredSize(new Dimension(200,20));  
        final int style[]={Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};  
        final JTextField sizeText=new JTextField(5);  
        sizeText.setPreferredSize(new Dimension(200,20));  
        JButton okButton=new JButton("确定");  
        JButton cancel=new JButton("取消");  
        cancel.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   fontDialog.dispose();     
            }  
        });  
        Font currentFont=text.getFont();  
        fontText.setText(currentFont.getFontName());  
        fontText.selectAll();  
        //styleText.setText(currentFont.getStyle());  
        //styleText.selectAll();  
        if(currentFont.getStyle()==Font.PLAIN)  
            styleText.setText("常规");  
        else if(currentFont.getStyle()==Font.BOLD)  
            styleText.setText("粗体");  
        else if(currentFont.getStyle()==Font.ITALIC)  
            styleText.setText("斜体");  
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))  
            styleText.setText("粗斜体");  
        styleText.selectAll();  
        String str=String.valueOf(currentFont.getSize());  
        sizeText.setText(str);  
        sizeText.selectAll();  
        final JList fontList,styleList,sizeList;  
        GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();  
        final String fontName[]=ge.getAvailableFontFamilyNames();  
        fontList=new JList(fontName);  
        fontList.setFixedCellWidth(86);  
        fontList.setFixedCellHeight(20);  
        fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        final String fontStyle[]={"常规","粗体","斜体","粗斜体"};  
        styleList=new JList(fontStyle);  
        styleList.setFixedCellWidth(86);  
        styleList.setFixedCellHeight(20);  
        styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        if(currentFont.getStyle()==Font.PLAIN)  
            styleList.setSelectedIndex(0);  
        else if(currentFont.getStyle()==Font.BOLD)  
            styleList.setSelectedIndex(1);  
        else if(currentFont.getStyle()==Font.ITALIC)  
            styleList.setSelectedIndex(2);  
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))  
            styleList.setSelectedIndex(3);  
        final String fontSize[]={"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};  
        sizeList=new JList(fontSize);  
        sizeList.setFixedCellWidth(43);  
        sizeList.setFixedCellHeight(20);  
        sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        fontList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   fontText.setText(fontName[fontList.getSelectedIndex()]);  
                fontText.selectAll();  
                Font sampleFont1=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont1);  
            }  
        });  
        styleList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   int s=style[styleList.getSelectedIndex()];  
                styleText.setText(fontStyle[s]);  
                styleText.selectAll();  
                Font sampleFont2=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont2);  
            }  
        });  
        sizeList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   sizeText.setText(fontSize[sizeList.getSelectedIndex()]);  
                //sizeText.requestFocus();  
                sizeText.selectAll();     
                Font sampleFont3=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont3);  
            }  
        });  
        okButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   Font okFont=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                text.setFont(okFont);  
                fontDialog.dispose();  
            }  
        });  
        JPanel samplePanel=new JPanel();  
        samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));  
        //samplePanel.setLayout(new FlowLayout(FlowLayout.CENTER));  
        samplePanel.add(sample);  
        JPanel panel1=new JPanel();  
        JPanel panel2=new JPanel();  
        JPanel panel3=new JPanel();  

        panel2.add(fontText);  
        panel2.add(styleText);  
        panel2.add(sizeText);  
        panel2.add(okButton);  
        panel3.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图  
        panel3.add(new JScrollPane(styleList));  
        panel3.add(new JScrollPane(sizeList));  
        panel3.add(cancel);  
        con.add(panel1);  
        con.add(panel2);  
        con.add(panel3);  
        con.add(samplePanel);  
        fontDialog.setSize(350,340);  
        fontDialog.setLocation(200,200);  
        fontDialog.setResizable(false);  
        fontDialog.setVisible(true);  
    }
    public void exitWindowChoose()//关闭窗口时判断方法  
    {   text.requestFocus();  
        String str1=text.getText();  
        if(str1.equals(oldValue)==true)  
        {   System.exit(0);  
        }  
        else  
        {   int exitChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","退出提示",JOptionPane.YES_NO_CANCEL_OPTION);  
            if(exitChoose==JOptionPane.YES_OPTION)  
            {   //boolean isSave=false;  
                if(isNewFile)  
                {     
                    String str=null;  
                    JFileChooser fileChooser=new JFileChooser();  
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                    fileChooser.setApproveButtonText("确定");  
                    fileChooser.setDialogTitle("另存为");  
                    
                    int result=fileChooser.showSaveDialog(this);  
                    
                    if(result==JFileChooser.CANCEL_OPTION)  
                    {   label.setText(" 您没有保存文件");  
                        return;  
                    }                       
                    File saveFileName=fileChooser.getSelectedFile();  

                    if(saveFileName==null||saveFileName.getName().equals(""))  
                    {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                    }  
                    else   
                    {   try  
                        {   FileWriter fw3=new FileWriter(saveFileName);  
                            BufferedWriter bw3=new BufferedWriter(fw3);  
                            bw3.write(text.getText(),0,text.getText().length());  
                            bw3.flush();  
                            fw3.close();  
                            
                            isNewFile=false;  
                            currentFile=saveFileName;  
                            oldValue=text.getText();  
                            
                            this.setTitle(saveFileName.getName()+"  - 记事本");  
                            label.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());  
                            //isSave=true;  
                        }                             
                        catch(IOException ioException){                   
                        }                 
                    }  
                }  
                else  
                {  
                    try  
                    {   FileWriter fw4=new FileWriter(currentFile);  
                        BufferedWriter bw4=new BufferedWriter(fw4);  
                        bw4.write(text.getText(),0,text.getText().length());  
                        bw4.flush();  
                        fw4.close();  
                        //isSave=true;  
                    }                             
                    catch(IOException ioException){                   
                    }  
                }  
                System.exit(0);  
                //if(isSave)System.exit(0);  
                //else return;  
            }  
            else if(exitChoose==JOptionPane.NO_OPTION)  
            {   System.exit(0);  
            }  
            else  
            {   return;  
            }  
        }
    }
    public void save(){//保存方法
        jfc2 = new JFileChooser();
        jfc2.setDialogTitle("另存为...");
        int state=jfc2.showSaveDialog(this);
        bcwjm=jfc2.getSelectedFile();//获取第一次保存文件夹的路径及原名
        if(state==JFileChooser.APPROVE_OPTION){
        try{
            dir=jfc2.getCurrentDirectory();
            str=jfc2.getSelectedFile().getName();
            File file = new File(dir,str);
            fw = new FileWriter(file);
            bw = new BufferedWriter(fw);
            bw.write(text.getText());
            bw.close();
            fw.close();
        }
        catch(IOException exp){}
        }
    }
    public void actionPerformed(ActionEvent e){
        String str=e.getActionCommand();
        if(str.equals("新建(N)")){
            
            text.requestFocus();//获取焦点
            String str1 = text.getText();
            boolean textIsChange = (str1.equals(oldValue))?false:true;//判断是否改变文件
            if(textIsChange){
                int saveChoose = JOptionPane.showConfirmDialog(this,"你的文件未保存","提示",JOptionPane.YES_NO_CANCEL_OPTION);
                if(saveChoose==JOptionPane.YES_OPTION){
                    String st=null;
                    JFileChooser file = new JFileChooser();
                    file.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    file.setDialogTitle("另存为");
                    int result=file.showSaveDialog(this);  
                if(result==JFileChooser.CANCEL_OPTION){
                    label.setText("你没有选择文件");
                    return;
                }
                //获取保存文件名  
                File saveFileName=file.getSelectedFile();  
                if(saveFileName==null || saveFileName.getName().equals(""))  
                {   JOptionPane.showMessageDialog(this,"不合法文件名","不合法文件名",JOptionPane.ERROR_MESSAGE);  
                }  
                    else{
                        try  
                        {   FileWriter fw2=new FileWriter(saveFileName);  
                            BufferedWriter bw2=new BufferedWriter(fw2);  
                            bw2.write(text.getText(),0,text.getText().length());  
                            bw2.flush();//刷新该流的缓冲  
                            bw2.close();  
                            isNewFile=false;  
                            currentFile=saveFileName;  
                            oldValue=text.getText();  
                            this.setTitle(saveFileName.getName()+" - 记事本");  
                            label.setText("当前打开文件:"+saveFileName.getAbsoluteFile());  
                        }  
                        catch (IOException ioException)  
                        {  
                        }  
                    }  
                }  
                else if(saveChoose==JOptionPane.NO_OPTION)  
                {   text.replaceRange("",0,text.getText().length());  
                    label.setText("新建文件");
                    this.setTitle("无标题——记事本");  
                    isNewFile=true;  
                    undo.discardAllEdits(); //撤销所有已“撤销”的操作  
                    cai21.setEnabled(false);  
                    oldValue=text.getText();  
                }  
                else if(saveChoose==JOptionPane.CANCEL_OPTION){
                    return;  
                }  
            }  
            else  
            {   text.replaceRange("",0,text.getText().length());  
                label.setText(" 新建文件");  
                this.setTitle("无标题——记事本");  
                isNewFile=true;  
                undo.discardAllEdits();//撤销所有已“撤销”的操作  
                cai21.setEnabled(false);  
                oldValue=text.getText();  
            } 
        }
        else if(str.equals("新窗口(W)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("打开(O)")){
            this.setVisible(true);
            JFileChooser jfc1=new JFileChooser();
            jfc1.setDialogTitle("打开文件...");
			//默认方式
			jfc1.showOpenDialog(null);
			//显示
			jfc1.setVisible(true);
            
            //得到文件路径
			String filename=jfc1.getSelectedFile().getAbsolutePath();
            try{
                fr=new FileReader(filename);
				br=new BufferedReader(fr);
				//从文件中循环读取,并显示到text中
				String s="";
				String sus="";
				while((s=br.readLine())!=null)
				{
					//显示到text中
					sus+=s+"\r\n";
                }
                text.setText(sus);
            }
        catch(Exception e1){
            e1.printStackTrace();
        }
        finally 
			{
				try {
					fr.close();
					br.close();
				} catch (Exception e2) {
					e2.printStackTrace();
				}
				
			}
			
        }
        else if(str.equals("保存(S)")){
           /* //设置弹出对话框
			JFileChooser jfc2=new JFileChooser();
			jfc2.setDialogTitle("另存为...");
			//默认显示方式
			jfc2.showSaveDialog(null);
			jfc2.setVisible(true);
			
			//获取文件保存路径
			String filename2=jfc2.getSelectedFile().getAbsolutePath();
			//写人
			fw=null;
			bw=null;
			
			try {
				fw=new FileWriter(filename2);
				bw=new BufferedWriter(fw);
				bw.write(this.text.getText());
				
			} catch (Exception e3) {

				e3.printStackTrace();
			}
			finally
			{
				try {
                    bw.close();
                    fw.close();
                } catch (Exception e4) {
					e4.printStackTrace();
                }
            }
        }*/
        if(a==0&&b==0){
            save();
            a=1;
        }
        if(a==1&&b==1){
            try{
                //File file = new File(dir,str);
                fw1 = new FileWriter(bcwjm);
                bw1 = new BufferedWriter(fw1);
                bw1.write(text.getText());
                bw1.close();
                fw1.close();
                currentFile=bcwjm;
                oldValue=text.getText();
                this.setTitle(bcwjm.getName()+"记事本");
                label.setText("当前打开文件:"+bcwjm.getAbsoluteFile());
            }
            catch(IOException exp){}
        }
        b=1;
    }
        else if(str.equals("另存为(A)")){
            save();
        }
        else if(str.equals("页面设置(U)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚且无此功能");
        }
        else if(str.equals("打印(P)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("退出(X)")){
            System.exit(0);
            
        }
        else if(str.equals("撤销(U)")){
            text.requestFocus();
            if(undo.canUndo())  
            {   try  
                {   undo.undo();  
                }  
                catch (CannotUndoException ex)  
                {   System.out.println("Unable to undo:" + ex);  
                    //ex.printStackTrace();  
                }  
            }  
            if(!undo.canUndo())  
                {   editMenu_Undo.setEnabled(false);  
                }
        }
        else if(str.equals("剪切(T)")){
            text.cut();
        }
        else if(str.equals("复制(C)")){
            /*text.requestFocus();
            String str3=text.getSelectedText();  
            StringSelection selection=new StringSelection(str3);  
            clipBoard.setContents(selection,null);*/
            text.copy();
        }
        else if(str.equals("粘贴(P)")){
            text.paste();
        }
        else if(str.equals("删除(L)")){
            text.replaceSelection(null);
        }
        else if(str.equals("使用 Bing 搜索...")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }else if(str.equals("查找(F)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("查找上一个(N)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("查找下一个(V)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("替换(R)...")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("转到(G)...")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("全选(A)")){
            text.selectAll();
        }
        else if(str.equals("时间/日期(D)")){
            LocalDateTime date = LocalDateTime.now();
            text.setText(date.toString());
        }else if(str.equals("自动换行(W)")){
            if(cai31.getState())
                text.setLineWrap(true);
            else
                text.setLineWrap(false);
        }
        else if(str.equals("字体(F)")){
            text.requestFocus();
            font();
        }
        else if(str.equals("前景色")){
            Color newColor1 = JColorChooser.showDialog(this,"选择你所喜欢的前景颜色",text.getForeground());
            if(newColor1!=null){
                text.setForeground(newColor1);
            }
        }
        else if(str.equals("背景色")){       
            Color newColor = JColorChooser.showDialog(this,"选择你所喜欢的背景颜色",text.getBackground());
            if(newColor!=null){
                text.setBackground(newColor);
            }
        }
        else if(str.equals("缩放(Z)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("状态栏(S)")){

        }
        else if(str.equals("放大(I)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("缩小(O)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("恢复默认缩放")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,"尚无此功能");
        }
        else if(str.equals("查看帮助(H)")){
        try { 
            String url = "https://i.csdn.net/#/uc/profile"; 
            java.net.URI uri = java.net.URI.create(url); 
            java.awt.Desktop dp = java.awt.Desktop.getDesktop(); 
            if (dp.isSupported(java.awt.Desktop.Action.BROWSE)) { 
                dp.browse(uri);
            }
            } catch (java.lang.NullPointerException e5) { 
                e5.printStackTrace(); 
            } catch (java.io.IOException e5) { 
            e5.printStackTrace(); 
            } 
            }
        else if(str.equals("关于反馈(F)")){
            
        }
        else if(str.equals("关于记事本(A)")){
            text.requestFocus();
            JOptionPane.showMessageDialog(this,
            "///—————————————————————《欢迎使用霖霖记事本》————————————————————///\n"+
            "——————————————————————————————————————————————————————\n"+
            "创作人:鲜霖\n"+
            "e-mail:linxian479@gmail.com\n"+
            "———1589861957@qq.com\n"+
            "创作时间:2020年6月20日\n"+
            "vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\n",
            "记事本",JOptionPane.INFORMATION_MESSAGE);
        }
}
    public void removeUpdate(DocumentEvent e)  
    {   cai21.setEnabled(true);  
    }  
    public void insertUpdate(DocumentEvent e)  
    {   cai21.setEnabled(true);  
    }  
    public void changedUpdate(DocumentEvent e)  
    {   cai21.setEnabled(true);  
    }//DocumentListener结束  

    class UndoHandler implements UndoableEditListener  
    {   public void undoableEditHappened(UndoableEditEvent uee)  
        {   undo.addEdit(uee.getEdit());  
        }  
    } 
}

 

// 主类
import data.*;
public class Xiaoxiaonote {
    public static void main(String [] args){
        Mynote s = new Mynote();
    } 
}

 

今天给大家介绍一下关于如何用Java实现记事本功能,是学习Java swing的一个非常好的案例,下面先看一下运行结果(下载地址在最下面):

下面我们来看源码:

import java.awt.*;  
 import java.awt.event.*;  
 import java.text.*;  
 import java.util.*;  
 import java.io.*;  
 import javax.swing.undo.*;  
 import javax.swing.border.*;  
 import javax.swing.*;  
 import javax.swing.text.*;  
 import javax.swing.event.*;  
import java.awt.datatransfer.*;  
  
  
public class Notepad extends JFrame implements ActionListener,DocumentListener  
{   //菜单  
    JMenu fileMenu,editMenu,formatMenu,viewMenu,helpMenu;  
    //右键弹出菜单项  
    JPopupMenu popupMenu;  
    JMenuItem popupMenu_Undo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;  
    //“文件”的菜单项  
    JMenuItem fileMenu_New,fileMenu_Open,fileMenu_Save,fileMenu_SaveAs,fileMenu_PageSetUp,fileMenu_Print,fileMenu_Exit;  
    //“编辑”的菜单项  
    JMenuItem editMenu_Undo,editMenu_Cut,editMenu_Copy,editMenu_Paste,editMenu_Delete,editMenu_Find,editMenu_FindNext,editMenu_Replace,editMenu_GoTo,editMenu_SelectAll,editMenu_TimeDate;  
    //“格式”的菜单项  
    JCheckBoxMenuItem formatMenu_LineWrap;  
    JMenuItem formatMenu_Font;  
    //“查看”的菜单项  
    JCheckBoxMenuItem viewMenu_Status;  
    //“帮助”的菜单项  
    JMenuItem helpMenu_HelpTopics,helpMenu_AboutNotepad;  
    //“文本”编辑区域  
    JTextArea editArea;  
    //状态栏标签  
    JLabel statusLabel;  
    //系统剪贴板  
    Toolkit toolkit=Toolkit.getDefaultToolkit();  
    Clipboard clipBoard=toolkit.getSystemClipboard();  
    //创建撤销操作管理器(与撤销操作有关)  
    protected UndoManager undo=new UndoManager();  
    protected UndoableEditListener undoHandler=new UndoHandler();  
    //其他变量  
    String oldValue;//存放编辑区原来的内容,用于比较文本是否有改动  
    boolean isNewFile=true;//是否新文件(未保存过的)  
    File currentFile;//当前文件名  
    //构造函数开始  
    public Notepad()  
    {     
        super("Java记事本");  
        //改变系统默认字体  
        Font font = new Font("Dialog", Font.PLAIN, 12);  
        java.util.Enumeration keys = UIManager.getDefaults().keys();  
        while (keys.hasMoreElements()) {  
            Object key = keys.nextElement();  
            Object value = UIManager.get(key);  
            if (value instanceof javax.swing.plaf.FontUIResource) {  
                UIManager.put(key, font);  
            }  
        }  
        //创建菜单条  
        JMenuBar menuBar=new JMenuBar();  
        //创建文件菜单及菜单项并注册事件监听  
        fileMenu=new JMenu("文件(F)");  
        fileMenu.setMnemonic('F');//设置快捷键ALT+F  
  
        fileMenu_New=new JMenuItem("新建(N)");  
        fileMenu_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));  
        fileMenu_New.addActionListener(this);  
  
        fileMenu_Open=new JMenuItem("打开(O)...");  
        fileMenu_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));  
        fileMenu_Open.addActionListener(this);  
  
        fileMenu_Save=new JMenuItem("保存(S)");  
        fileMenu_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));  
        fileMenu_Save.addActionListener(this);  
  
        fileMenu_SaveAs=new JMenuItem("另存为(A)...");  
        fileMenu_SaveAs.addActionListener(this);  
  
        fileMenu_PageSetUp=new JMenuItem("页面设置(U)...");  
        fileMenu_PageSetUp.addActionListener(this);  
  
        fileMenu_Print=new JMenuItem("打印(P)...");  
        fileMenu_Print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));   
        fileMenu_Print.addActionListener(this);  
  
        fileMenu_Exit=new JMenuItem("退出(X)");  
        fileMenu_Exit.addActionListener(this);  
  
        //创建编辑菜单及菜单项并注册事件监听  
        editMenu=new JMenu("编辑(E)");  
        editMenu.setMnemonic('E');//设置快捷键ALT+E  
        //当选择编辑菜单时,设置剪切、复制、粘贴、删除等功能的可用性  
        editMenu.addMenuListener(new MenuListener()  
        {   public void menuCanceled(MenuEvent e)//取消菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
            public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
            public void menuSelected(MenuEvent e)//选择某个菜单时调用  
            {   checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
            }  
        });  
  
        editMenu_Undo=new JMenuItem("撤销(U)");  
        editMenu_Undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));  
        editMenu_Undo.addActionListener(this);  
        editMenu_Undo.setEnabled(false);  
  
        editMenu_Cut=new JMenuItem("剪切(T)");  
        editMenu_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));  
        editMenu_Cut.addActionListener(this);  
  
        editMenu_Copy=new JMenuItem("复制(C)");  
        editMenu_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));  
        editMenu_Copy.addActionListener(this);  
  
        editMenu_Paste=new JMenuItem("粘贴(P)");  
        editMenu_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));  
        editMenu_Paste.addActionListener(this);  
  
        editMenu_Delete=new JMenuItem("删除(D)");  
        editMenu_Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));  
        editMenu_Delete.addActionListener(this);  
  
        editMenu_Find=new JMenuItem("查找(F)...");  
        editMenu_Find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));  
        editMenu_Find.addActionListener(this);  
  
        editMenu_FindNext=new JMenuItem("查找下一个(N)");  
        editMenu_FindNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));  
        editMenu_FindNext.addActionListener(this);  
  
        editMenu_Replace = new JMenuItem("替换(R)...",'R');   
        editMenu_Replace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));   
        editMenu_Replace.addActionListener(this);  
  
        editMenu_GoTo = new JMenuItem("转到(G)...",'G');   
        editMenu_GoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));   
        editMenu_GoTo.addActionListener(this);  
  
        editMenu_SelectAll = new JMenuItem("全选",'A');   
        editMenu_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));   
        editMenu_SelectAll.addActionListener(this);  
  
        editMenu_TimeDate = new JMenuItem("时间/日期(D)",'D');  
        editMenu_TimeDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));  
        editMenu_TimeDate.addActionListener(this);  
  
        //创建格式菜单及菜单项并注册事件监听  
        formatMenu=new JMenu("格式(O)");  
        formatMenu.setMnemonic('O');//设置快捷键ALT+O  
  
        formatMenu_LineWrap=new JCheckBoxMenuItem("自动换行(W)");  
        formatMenu_LineWrap.setMnemonic('W');//设置快捷键ALT+W  
        formatMenu_LineWrap.setState(true);  
        formatMenu_LineWrap.addActionListener(this);  
  
        formatMenu_Font=new JMenuItem("字体(F)...");  
        formatMenu_Font.addActionListener(this);  
  
        //创建查看菜单及菜单项并注册事件监听  
        viewMenu=new JMenu("查看(V)");  
        viewMenu.setMnemonic('V');//设置快捷键ALT+V  
  
        viewMenu_Status=new JCheckBoxMenuItem("状态栏(S)");  
        viewMenu_Status.setMnemonic('S');//设置快捷键ALT+S  
        viewMenu_Status.setState(true);  
        viewMenu_Status.addActionListener(this);  
  
        //创建帮助菜单及菜单项并注册事件监听  
        helpMenu = new JMenu("帮助(H)");  
        helpMenu.setMnemonic('H');//设置快捷键ALT+H  
  
        helpMenu_HelpTopics = new JMenuItem("帮助主题(H)");   
        helpMenu_HelpTopics.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));  
        helpMenu_HelpTopics.addActionListener(this);  
  
        helpMenu_AboutNotepad = new JMenuItem("关于记事本(A)");   
        helpMenu_AboutNotepad.addActionListener(this);  
  
        //向菜单条添加"文件"菜单及菜单项  
        menuBar.add(fileMenu);   
        fileMenu.add(fileMenu_New);   
        fileMenu.add(fileMenu_Open);   
        fileMenu.add(fileMenu_Save);   
        fileMenu.add(fileMenu_SaveAs);   
        fileMenu.addSeparator();        //分隔线  
        fileMenu.add(fileMenu_PageSetUp);   
        fileMenu.add(fileMenu_Print);   
        fileMenu.addSeparator();        //分隔线   
        fileMenu.add(fileMenu_Exit);   
  
        //向菜单条添加"编辑"菜单及菜单项   
        menuBar.add(editMenu);   
        editMenu.add(editMenu_Undo);    
        editMenu.addSeparator();        //分隔线   
        editMenu.add(editMenu_Cut);   
        editMenu.add(editMenu_Copy);   
        editMenu.add(editMenu_Paste);   
        editMenu.add(editMenu_Delete);   
        editMenu.addSeparator();        //分隔线  
        editMenu.add(editMenu_Find);   
        editMenu.add(editMenu_FindNext);   
        editMenu.add(editMenu_Replace);  
        editMenu.add(editMenu_GoTo);   
        editMenu.addSeparator();        //分隔线  
        editMenu.add(editMenu_SelectAll);   
        editMenu.add(editMenu_TimeDate);  
  
        //向菜单条添加"格式"菜单及菜单项        
        menuBar.add(formatMenu);   
        formatMenu.add(formatMenu_LineWrap);   
        formatMenu.add(formatMenu_Font);  
  
        //向菜单条添加"查看"菜单及菜单项   
        menuBar.add(viewMenu);   
        viewMenu.add(viewMenu_Status);  
  
        //向菜单条添加"帮助"菜单及菜单项  
        menuBar.add(helpMenu);  
        helpMenu.add(helpMenu_HelpTopics);  
        helpMenu.addSeparator();  
        helpMenu.add(helpMenu_AboutNotepad);  
                  
        //向窗口添加菜单条                
        this.setJMenuBar(menuBar);  
  
        //创建文本编辑区并添加滚动条  
        editArea=new JTextArea(20,50);  
        JScrollPane scroller=new JScrollPane(editArea);  
        scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);  
        this.add(scroller,BorderLayout.CENTER);//向窗口添加文本编辑区  
        editArea.setWrapStyleWord(true);//设置单词在一行不足容纳时换行  
        editArea.setLineWrap(true);//设置文本编辑区自动换行默认为true,即会"自动换行"  
        //this.add(editArea,BorderLayout.CENTER);//向窗口添加文本编辑区  
        oldValue=editArea.getText();//获取原文本编辑区的内容  
  
        //编辑区注册事件监听(与撤销操作有关)  
        editArea.getDocument().addUndoableEditListener(undoHandler);  
        editArea.getDocument().addDocumentListener(this);  
  
        //创建右键弹出菜单  
        popupMenu=new JPopupMenu();  
        popupMenu_Undo=new JMenuItem("撤销(U)");  
        popupMenu_Cut=new JMenuItem("剪切(T)");  
        popupMenu_Copy=new JMenuItem("复制(C)");  
        popupMenu_Paste=new JMenuItem("粘帖(P)");  
        popupMenu_Delete=new JMenuItem("删除(D)");  
        popupMenu_SelectAll=new JMenuItem("全选(A)");  
  
        popupMenu_Undo.setEnabled(false);  
  
        //向右键菜单添加菜单项和分隔符  
        popupMenu.add(popupMenu_Undo);  
        popupMenu.addSeparator();  
        popupMenu.add(popupMenu_Cut);  
        popupMenu.add(popupMenu_Copy);  
        popupMenu.add(popupMenu_Paste);  
        popupMenu.add(popupMenu_Delete);  
        popupMenu.addSeparator();  
        popupMenu.add(popupMenu_SelectAll);  
  
        //文本编辑区注册右键菜单事件  
        popupMenu_Undo.addActionListener(this);  
        popupMenu_Cut.addActionListener(this);  
        popupMenu_Copy.addActionListener(this);  
        popupMenu_Paste.addActionListener(this);  
        popupMenu_Delete.addActionListener(this);  
        popupMenu_SelectAll.addActionListener(this);  
  
        //文本编辑区注册右键菜单事件  
        editArea.addMouseListener(new MouseAdapter()  
        {   public void mousePressed(MouseEvent e)  
            {   if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件  
                {   popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单  
                }  
                checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性  
                editArea.requestFocus();//编辑区获取焦点  
            }  
            public void mouseReleased(MouseEvent e)  
            {   if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件  
                {   popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单  
                }  
                checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性  
                editArea.requestFocus();//编辑区获取焦点  
            }  
        });//文本编辑区注册右键菜单事件结束  
  
        //创建和添加状态栏  
        statusLabel=new JLabel(" 按F1获取帮助");  
        this.add(statusLabel,BorderLayout.SOUTH);//向窗口添加状态栏标签  
  
        //设置窗口在屏幕上的位置、大小和可见性   
        this.setLocation(100,100);  
        this.setSize(650,550);  
        this.setVisible(true);  
        //添加窗口监听器  
        addWindowListener(new WindowAdapter()  
        {   public void windowClosing(WindowEvent e)  
            {   exitWindowChoose();  
            }  
        });  
  
        checkMenuItemEnabled();  
        editArea.requestFocus();  
    }//构造函数Notepad结束  
      
    //设置菜单项的可用性:剪切,复制,粘帖,删除功能  
    public void checkMenuItemEnabled()  
    {   String selectText=editArea.getSelectedText();  
        if(selectText==null)  
        {   editMenu_Cut.setEnabled(false);  
            popupMenu_Cut.setEnabled(false);  
            editMenu_Copy.setEnabled(false);  
            popupMenu_Copy.setEnabled(false);  
            editMenu_Delete.setEnabled(false);  
            popupMenu_Delete.setEnabled(false);  
        }  
        else  
        {   editMenu_Cut.setEnabled(true);  
            popupMenu_Cut.setEnabled(true);   
            editMenu_Copy.setEnabled(true);  
            popupMenu_Copy.setEnabled(true);  
            editMenu_Delete.setEnabled(true);  
            popupMenu_Delete.setEnabled(true);  
        }  
        //粘帖功能可用性判断  
        Transferable contents=clipBoard.getContents(this);  
        if(contents==null)  
        {   editMenu_Paste.setEnabled(false);  
            popupMenu_Paste.setEnabled(false);  
        }  
        else  
        {   editMenu_Paste.setEnabled(true);  
            popupMenu_Paste.setEnabled(true);     
        }  
    }//方法checkMenuItemEnabled()结束  
  
    //关闭窗口时调用  
    public void exitWindowChoose()  
    {   editArea.requestFocus();  
        String currentValue=editArea.getText();  
        if(currentValue.equals(oldValue)==true)  
        {   System.exit(0);  
        }  
        else  
        {   int exitChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","退出提示",JOptionPane.YES_NO_CANCEL_OPTION);  
            if(exitChoose==JOptionPane.YES_OPTION)  
            {   //boolean isSave=false;  
                if(isNewFile)  
                {     
                    String str=null;  
                    JFileChooser fileChooser=new JFileChooser();  
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                    fileChooser.setApproveButtonText("确定");  
                    fileChooser.setDialogTitle("另存为");  
                      
                    int result=fileChooser.showSaveDialog(this);  
                      
                    if(result==JFileChooser.CANCEL_OPTION)  
                    {   statusLabel.setText(" 您没有保存文件");  
                        return;  
                    }                     
      
                    File saveFileName=fileChooser.getSelectedFile();  
                  
                    if(saveFileName==null||saveFileName.getName().equals(""))  
                    {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                    }  
                    else   
                    {   try  
                        {   FileWriter fw=new FileWriter(saveFileName);  
                            BufferedWriter bfw=new BufferedWriter(fw);  
                            bfw.write(editArea.getText(),0,editArea.getText().length());  
                            bfw.flush();  
                            fw.close();  
                              
                            isNewFile=false;  
                            currentFile=saveFileName;  
                            oldValue=editArea.getText();  
                              
                            this.setTitle(saveFileName.getName()+"  - 记事本");  
                            statusLabel.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());  
                            //isSave=true;  
                        }                             
                        catch(IOException ioException){                   
                        }                 
                    }  
                }  
                else  
                {  
                    try  
                    {   FileWriter fw=new FileWriter(currentFile);  
                        BufferedWriter bfw=new BufferedWriter(fw);  
                        bfw.write(editArea.getText(),0,editArea.getText().length());  
                        bfw.flush();  
                        fw.close();  
                        //isSave=true;  
                    }                             
                    catch(IOException ioException){                   
                    }  
                }  
                System.exit(0);  
                //if(isSave)System.exit(0);  
                //else return;  
            }  
            else if(exitChoose==JOptionPane.NO_OPTION)  
            {   System.exit(0);  
            }  
            else  
            {   return;  
            }  
        }  
    }//关闭窗口时调用方法结束  
  
    //查找方法  
    public void find()  
    {   final JDialog findDialog=new JDialog(this,"查找",false);//false时允许其他窗口同时处于激活状态(即无模式)  
        Container con=findDialog.getContentPane();//返回此对话框的contentPane对象      
        con.setLayout(new FlowLayout(FlowLayout.LEFT));  
        JLabel findContentLabel=new JLabel("查找内容(N):");  
        final JTextField findText=new JTextField(15);  
        JButton findNextButton=new JButton("查找下一个(F):");  
        final JCheckBox matchCheckBox=new JCheckBox("区分大小写(C)");  
        ButtonGroup bGroup=new ButtonGroup();  
        final JRadioButton upButton=new JRadioButton("向上(U)");  
        final JRadioButton downButton=new JRadioButton("向下(U)");  
        downButton.setSelected(true);  
        bGroup.add(upButton);  
        bGroup.add(downButton);  
        /*ButtonGroup此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。 
        使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。*/  
        /*JRadioButton此类实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。 
        与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。 
        (创建一个 ButtonGroup 对象并用其 add 方法将 JRadioButton 对象包含在此组中。)*/  
        JButton cancel=new JButton("取消");  
        //取消按钮事件处理  
        cancel.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   findDialog.dispose();  
            }  
        });  
        //"查找下一个"按钮监听  
        findNextButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   //"区分大小写(C)"的JCheckBox是否被选中  
                int k=0,m=0;  
                final String str1,str2,str3,str4,strA,strB;  
                str1=editArea.getText();  
                str2=findText.getText();  
                str3=str1.toUpperCase();  
                str4=str2.toUpperCase();  
                if(matchCheckBox.isSelected())//区分大小写  
                {   strA=str1;  
                    strB=str2;  
                }  
                else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找   
                {   strA=str3;  
                    strB=str4;  
                }  
                if(upButton.isSelected())  
                {   //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                    if(editArea.getSelectedText()==null)  
                        k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                    else  
                        k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);      
                    if(k>-1)  
                    {   //String strData=strA.subString(k,strB.getText().length()+1);  
                        editArea.setCaretPosition(k);  
                        editArea.select(k,k+strB.length());  
                    }  
                    else  
                    {   JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);  
                    }  
                }  
                else if(downButton.isSelected())  
                {   if(editArea.getSelectedText()==null)  
                        k=strA.indexOf(strB,editArea.getCaretPosition()+1);  
                    else  
                        k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);      
                    if(k>-1)  
                    {   //String strData=strA.subString(k,strB.getText().length()+1);  
                        editArea.setCaretPosition(k);  
                        editArea.select(k,k+strB.length());  
                    }  
                    else  
                    {   JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);  
                    }  
                }  
            }  
        });//"查找下一个"按钮监听结束  
        //创建"查找"对话框的界面  
        JPanel panel1=new JPanel();  
        JPanel panel2=new JPanel();  
        JPanel panel3=new JPanel();  
        JPanel directionPanel=new JPanel();  
        directionPanel.setBorder(BorderFactory.createTitledBorder("方向"));  
        //设置directionPanel组件的边框;  
        //BorderFactory.createTitledBorder(String title)创建一个新标题边框,使用默认边框(浮雕化)、默认文本位置(位于顶线上)、默认调整 (leading) 以及由当前外观确定的默认字体和文本颜色,并指定了标题文本。  
        directionPanel.add(upButton);  
        directionPanel.add(downButton);  
        panel1.setLayout(new GridLayout(2,1));  
        panel1.add(findNextButton);  
        panel1.add(cancel);  
        panel2.add(findContentLabel);  
        panel2.add(findText);  
        panel2.add(panel1);  
        panel3.add(matchCheckBox);  
        panel3.add(directionPanel);  
        con.add(panel2);  
        con.add(panel3);  
        findDialog.setSize(410,180);  
        findDialog.setResizable(false);//不可调整大小  
        findDialog.setLocation(230,280);  
        findDialog.setVisible(true);  
    }//查找方法结束  
      
    //替换方法  
    public void replace()  
    {   final JDialog replaceDialog=new JDialog(this,"替换",false);//false时允许其他窗口同时处于激活状态(即无模式)  
        Container con=replaceDialog.getContentPane();//返回此对话框的contentPane对象  
        con.setLayout(new FlowLayout(FlowLayout.CENTER));  
        JLabel findContentLabel=new JLabel("查找内容(N):");  
        final JTextField findText=new JTextField(15);  
        JButton findNextButton=new JButton("查找下一个(F):");  
        JLabel replaceLabel=new JLabel("替换为(P):");  
        final JTextField replaceText=new JTextField(15);  
        JButton replaceButton=new JButton("替换(R)");  
        JButton replaceAllButton=new JButton("全部替换(A)");  
        JButton cancel=new JButton("取消");  
        cancel.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   replaceDialog.dispose();  
            }  
        });  
        final JCheckBox matchCheckBox=new JCheckBox("区分大小写(C)");  
        ButtonGroup bGroup=new ButtonGroup();  
        final JRadioButton upButton=new JRadioButton("向上(U)");  
        final JRadioButton downButton=new JRadioButton("向下(U)");  
        downButton.setSelected(true);  
        bGroup.add(upButton);  
        bGroup.add(downButton);  
        /*ButtonGroup此类用于为一组按钮创建一个多斥(multiple-exclusion)作用域。 
        使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。*/  
        /*JRadioButton此类实现一个单选按钮,此按钮项可被选择或取消选择,并可为用户显示其状态。 
        与 ButtonGroup 对象配合使用可创建一组按钮,一次只能选择其中的一个按钮。 
        (创建一个 ButtonGroup 对象并用其 add 方法将 JRadioButton 对象包含在此组中。)*/  
          
        //"查找下一个"按钮监听  
        findNextButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   //"区分大小写(C)"的JCheckBox是否被选中  
                int k=0,m=0;  
                final String str1,str2,str3,str4,strA,strB;  
                str1=editArea.getText();  
                str2=findText.getText();  
                str3=str1.toUpperCase();  
                str4=str2.toUpperCase();  
                if(matchCheckBox.isSelected())//区分大小写  
                {   strA=str1;  
                    strB=str2;  
                }  
                else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找   
                {   strA=str3;  
                    strB=str4;  
                }  
                if(upButton.isSelected())  
                {   //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                    if(editArea.getSelectedText()==null)  
                        k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                    else  
                        k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);      
                    if(k>-1)  
                    {   //String strData=strA.subString(k,strB.getText().length()+1);  
                        editArea.setCaretPosition(k);  
                        editArea.select(k,k+strB.length());  
                    }  
                    else  
                    {   JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);  
                    }  
                }  
                else if(downButton.isSelected())  
                {   if(editArea.getSelectedText()==null)  
                        k=strA.indexOf(strB,editArea.getCaretPosition()+1);  
                    else  
                        k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);      
                    if(k>-1)  
                    {   //String strData=strA.subString(k,strB.getText().length()+1);  
                        editArea.setCaretPosition(k);  
                        editArea.select(k,k+strB.length());  
                    }  
                    else  
                    {   JOptionPane.showMessageDialog(null,"找不到您查找的内容!","查找",JOptionPane.INFORMATION_MESSAGE);  
                    }  
                }  
            }  
        });//"查找下一个"按钮监听结束  
          
        //"替换"按钮监听  
        replaceButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   if(replaceText.getText().length()==0 && editArea.getSelectedText()!=null)   
                    editArea.replaceSelection("");   
                if(replaceText.getText().length()>0 && editArea.getSelectedText()!=null)   
                    editArea.replaceSelection(replaceText.getText());  
            }  
        });//"替换"按钮监听结束  
          
        //"全部替换"按钮监听  
        replaceAllButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   editArea.setCaretPosition(0);   //将光标放到编辑区开头      
                int k=0,m=0,replaceCount=0;  
                if(findText.getText().length()==0)  
                {   JOptionPane.showMessageDialog(replaceDialog,"请填写查找内容!","提示",JOptionPane.WARNING_MESSAGE);  
                    findText.requestFocus(true);  
                    return;  
                }  
                while(k>-1)//当文本中有内容被选中时(k>-1被选中)进行替换,否则不进行while循环  
                {   //"区分大小写(C)"的JCheckBox是否被选中  
                    //int k=0,m=0;  
                    final String str1,str2,str3,str4,strA,strB;  
                    str1=editArea.getText();  
                    str2=findText.getText();  
                    str3=str1.toUpperCase();  
                    str4=str2.toUpperCase();  
                    if(matchCheckBox.isSelected())//区分大小写  
                    {   strA=str1;  
                        strB=str2;  
                    }  
                    else//不区分大小写,此时把所选内容全部化成大写(或小写),以便于查找   
                    {   strA=str3;  
                        strB=str4;  
                    }  
                    if(upButton.isSelected())  
                    {   //k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                        if(editArea.getSelectedText()==null)  
                            k=strA.lastIndexOf(strB,editArea.getCaretPosition()-1);  
                        else  
                            k=strA.lastIndexOf(strB, editArea.getCaretPosition()-findText.getText().length()-1);      
                        if(k>-1)  
                        {   //String strData=strA.subString(k,strB.getText().length()+1);  
                            editArea.setCaretPosition(k);  
                            editArea.select(k,k+strB.length());  
                        }  
                        else  
                        {   if(replaceCount==0)  
                            {   JOptionPane.showMessageDialog(replaceDialog, "找不到您查找的内容!", "记事本",JOptionPane.INFORMATION_MESSAGE);   
                            }  
                            else  
                            {   JOptionPane.showMessageDialog(replaceDialog,"成功替换"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);  
                            }  
                        }  
                    }  
                    else if(downButton.isSelected())  
                    {   if(editArea.getSelectedText()==null)  
                            k=strA.indexOf(strB,editArea.getCaretPosition()+1);  
                        else  
                            k=strA.indexOf(strB, editArea.getCaretPosition()-findText.getText().length()+1);      
                        if(k>-1)  
                        {   //String strData=strA.subString(k,strB.getText().length()+1);  
                            editArea.setCaretPosition(k);  
                            editArea.select(k,k+strB.length());  
                        }  
                        else  
                        {   if(replaceCount==0)  
                            {   JOptionPane.showMessageDialog(replaceDialog, "找不到您查找的内容!", "记事本",JOptionPane.INFORMATION_MESSAGE);   
                            }  
                            else  
                            {   JOptionPane.showMessageDialog(replaceDialog,"成功替换"+replaceCount+"个匹配内容!","替换成功",JOptionPane.INFORMATION_MESSAGE);  
                            }  
                        }  
                    }  
                    if(replaceText.getText().length()==0 && editArea.getSelectedText()!= null)  
                    {   editArea.replaceSelection("");  
                        replaceCount++;  
                    }   
                      
                    if(replaceText.getText().length()>0 && editArea.getSelectedText()!= null)   
                    {   editArea.replaceSelection(replaceText.getText());   
                        replaceCount++;  
                    }  
                }//while循环结束  
            }  
        });//"替换全部"方法结束  
          
        //创建"替换"对话框的界面  
        JPanel directionPanel=new JPanel();  
        directionPanel.setBorder(BorderFactory.createTitledBorder("方向"));  
        //设置directionPanel组件的边框;  
        //BorderFactory.createTitledBorder(String title)创建一个新标题边框,使用默认边框(浮雕化)、默认文本位置(位于顶线上)、默认调整 (leading) 以及由当前外观确定的默认字体和文本颜色,并指定了标题文本。  
        directionPanel.add(upButton);  
        directionPanel.add(downButton);  
        JPanel panel1=new JPanel();  
        JPanel panel2=new JPanel();  
        JPanel panel3=new JPanel();  
        JPanel panel4=new JPanel();  
        panel4.setLayout(new GridLayout(2,1));  
        panel1.add(findContentLabel);  
        panel1.add(findText);  
        panel1.add(findNextButton);  
        panel4.add(replaceButton);  
        panel4.add(replaceAllButton);  
        panel2.add(replaceLabel);  
        panel2.add(replaceText);  
        panel2.add(panel4);  
        panel3.add(matchCheckBox);  
        panel3.add(directionPanel);  
        panel3.add(cancel);  
        con.add(panel1);  
        con.add(panel2);  
        con.add(panel3);  
        replaceDialog.setSize(420,220);  
        replaceDialog.setResizable(false);//不可调整大小  
        replaceDialog.setLocation(230,280);  
        replaceDialog.setVisible(true);  
    }//"全部替换"按钮监听结束  
  
    //"字体"方法  
    public void font()  
    {   final JDialog fontDialog=new JDialog(this,"字体设置",false);  
        Container con=fontDialog.getContentPane();  
        con.setLayout(new FlowLayout(FlowLayout.LEFT));  
        JLabel fontLabel=new JLabel("字体(F):");  
        fontLabel.setPreferredSize(new Dimension(100,20));//构造一个Dimension,并将其初始化为指定宽度和高度  
        JLabel styleLabel=new JLabel("字形(Y):");  
        styleLabel.setPreferredSize(new Dimension(100,20));  
        JLabel sizeLabel=new JLabel("大小(S):");  
        sizeLabel.setPreferredSize(new Dimension(100,20));  
        final JLabel sample=new JLabel("张选仲的记事本-ZXZ's Notepad");  
        //sample.setHorizontalAlignment(SwingConstants.CENTER);  
        final JTextField fontText=new JTextField(9);  
        fontText.setPreferredSize(new Dimension(200,20));  
        final JTextField styleText=new JTextField(8);  
        styleText.setPreferredSize(new Dimension(200,20));  
        final int style[]={Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};  
        final JTextField sizeText=new JTextField(5);  
        sizeText.setPreferredSize(new Dimension(200,20));  
        JButton okButton=new JButton("确定");  
        JButton cancel=new JButton("取消");  
        cancel.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   fontDialog.dispose();     
            }  
        });  
        Font currentFont=editArea.getFont();  
        fontText.setText(currentFont.getFontName());  
        fontText.selectAll();  
        //styleText.setText(currentFont.getStyle());  
        //styleText.selectAll();  
        if(currentFont.getStyle()==Font.PLAIN)  
            styleText.setText("常规");  
        else if(currentFont.getStyle()==Font.BOLD)  
            styleText.setText("粗体");  
        else if(currentFont.getStyle()==Font.ITALIC)  
            styleText.setText("斜体");  
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))  
            styleText.setText("粗斜体");  
        styleText.selectAll();  
        String str=String.valueOf(currentFont.getSize());  
        sizeText.setText(str);  
        sizeText.selectAll();  
        final JList fontList,styleList,sizeList;  
        GraphicsEnvironment ge=GraphicsEnvironment.getLocalGraphicsEnvironment();  
        final String fontName[]=ge.getAvailableFontFamilyNames();  
        fontList=new JList(fontName);  
        fontList.setFixedCellWidth(86);  
        fontList.setFixedCellHeight(20);  
        fontList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        final String fontStyle[]={"常规","粗体","斜体","粗斜体"};  
        styleList=new JList(fontStyle);  
        styleList.setFixedCellWidth(86);  
        styleList.setFixedCellHeight(20);  
        styleList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        if(currentFont.getStyle()==Font.PLAIN)  
            styleList.setSelectedIndex(0);  
        else if(currentFont.getStyle()==Font.BOLD)  
            styleList.setSelectedIndex(1);  
        else if(currentFont.getStyle()==Font.ITALIC)  
            styleList.setSelectedIndex(2);  
        else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC))  
            styleList.setSelectedIndex(3);  
        final String fontSize[]={"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};  
        sizeList=new JList(fontSize);  
        sizeList.setFixedCellWidth(43);  
        sizeList.setFixedCellHeight(20);  
        sizeList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  
        fontList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   fontText.setText(fontName[fontList.getSelectedIndex()]);  
                fontText.selectAll();  
                Font sampleFont1=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont1);  
            }  
        });  
        styleList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   int s=style[styleList.getSelectedIndex()];  
                styleText.setText(fontStyle[s]);  
                styleText.selectAll();  
                Font sampleFont2=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont2);  
            }  
        });  
        sizeList.addListSelectionListener(new ListSelectionListener()  
        {   public void valueChanged(ListSelectionEvent event)  
            {   sizeText.setText(fontSize[sizeList.getSelectedIndex()]);  
                //sizeText.requestFocus();  
                sizeText.selectAll();     
                Font sampleFont3=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                sample.setFont(sampleFont3);  
            }  
        });  
        okButton.addActionListener(new ActionListener()  
        {   public void actionPerformed(ActionEvent e)  
            {   Font okFont=new Font(fontText.getText(),style[styleList.getSelectedIndex()],Integer.parseInt(sizeText.getText()));  
                editArea.setFont(okFont);  
                fontDialog.dispose();  
            }  
        });  
        JPanel samplePanel=new JPanel();  
        samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));  
        //samplePanel.setLayout(new FlowLayout(FlowLayout.CENTER));  
        samplePanel.add(sample);  
        JPanel panel1=new JPanel();  
        JPanel panel2=new JPanel();  
        JPanel panel3=new JPanel();  
        //JPanel panel4=new JPanel();  
        //JPanel panel5=new JPanel();  
        //panel1.add(fontLabel);  
        //panel1.add(styleLabel);  
        //panel1.add(sizeLabel);  
        //panel2.add(fontText);  
        //panel2.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图  
        //panel2.setLayout(new GridLayout(2,1));  
        //panel3.add(styleText);  
        //panel3.add(new JScrollPane(styleList));  
        //panel3.setLayout(new GridLayout(2,1));  
        //panel4.add(sizeText);  
        //panel4.add(new JScrollPane(sizeText));  
        //panel4.setLayout(new GridLayout(2,1));  
        //panel5.add(okButton);  
        //panel5.add(cancel);  
        //con.add(panel1);  
        //con.add(panel2);  
        //con.add(panel3);  
        //con.add(panel4);  
        //con.add(panel5);  
        panel2.add(fontText);  
        panel2.add(styleText);  
        panel2.add(sizeText);  
        panel2.add(okButton);  
        panel3.add(new JScrollPane(fontList));//JList不支持直接滚动,所以要让JList作为JScrollPane的视口视图  
        panel3.add(new JScrollPane(styleList));  
        panel3.add(new JScrollPane(sizeList));  
        panel3.add(cancel);  
        con.add(panel1);  
        con.add(panel2);  
        con.add(panel3);  
        con.add(samplePanel);  
        fontDialog.setSize(350,340);  
        fontDialog.setLocation(200,200);  
        fontDialog.setResizable(false);  
        fontDialog.setVisible(true);  
    }  
  
    //public void menuPerformed(MenuEvent e)  
    //{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
    //}  
  
    public void actionPerformed(ActionEvent e)  
    {   //新建  
        if(e.getSource()==fileMenu_New)  
        {   editArea.requestFocus();  
            String currentValue=editArea.getText();  
            boolean isTextChange=(currentValue.equals(oldValue))?false:true;  
            if(isTextChange)  
            {   int saveChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION);  
                if(saveChoose==JOptionPane.YES_OPTION)  
                {   String str=null;  
                    JFileChooser fileChooser=new JFileChooser();  
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                    //fileChooser.setApproveButtonText("确定");  
                    fileChooser.setDialogTitle("另存为");  
                    int result=fileChooser.showSaveDialog(this);  
                    if(result==JFileChooser.CANCEL_OPTION)  
                    {   statusLabel.setText("您没有选择任何文件");  
                        return;  
                    }  
                    File saveFileName=fileChooser.getSelectedFile();  
                    if(saveFileName==null || saveFileName.getName().equals(""))  
                    {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                    }  
                    else   
                    {   try  
                        {   FileWriter fw=new FileWriter(saveFileName);  
                            BufferedWriter bfw=new BufferedWriter(fw);  
                            bfw.write(editArea.getText(),0,editArea.getText().length());  
                            bfw.flush();//刷新该流的缓冲  
                            bfw.close();  
                            isNewFile=false;  
                            currentFile=saveFileName;  
                            oldValue=editArea.getText();  
                            this.setTitle(saveFileName.getName()+" - 记事本");  
                            statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());  
                        }  
                        catch (IOException ioException)  
                        {  
                        }  
                    }  
                }  
                else if(saveChoose==JOptionPane.NO_OPTION)  
                {   editArea.replaceRange("",0,editArea.getText().length());  
                    statusLabel.setText(" 新建文件");  
                    this.setTitle("无标题 - 记事本");  
                    isNewFile=true;  
                    undo.discardAllEdits(); //撤消所有的"撤消"操作  
                    editMenu_Undo.setEnabled(false);  
                    oldValue=editArea.getText();  
                }  
                else if(saveChoose==JOptionPane.CANCEL_OPTION)  
                {   return;  
                }  
            }  
            else  
            {   editArea.replaceRange("",0,editArea.getText().length());  
                statusLabel.setText(" 新建文件");  
                this.setTitle("无标题 - 记事本");  
                isNewFile=true;  
                undo.discardAllEdits();//撤消所有的"撤消"操作  
                editMenu_Undo.setEnabled(false);  
                oldValue=editArea.getText();  
            }  
        }//新建结束  
        //打开  
        else if(e.getSource()==fileMenu_Open)  
        {   editArea.requestFocus();  
            String currentValue=editArea.getText();  
            boolean isTextChange=(currentValue.equals(oldValue))?false:true;  
            if(isTextChange)  
            {   int saveChoose=JOptionPane.showConfirmDialog(this,"您的文件尚未保存,是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION);  
                if(saveChoose==JOptionPane.YES_OPTION)  
                {   String str=null;  
                    JFileChooser fileChooser=new JFileChooser();  
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                    //fileChooser.setApproveButtonText("确定");  
                    fileChooser.setDialogTitle("另存为");  
                    int result=fileChooser.showSaveDialog(this);  
                    if(result==JFileChooser.CANCEL_OPTION)  
                    {   statusLabel.setText("您没有选择任何文件");  
                        return;  
                    }  
                    File saveFileName=fileChooser.getSelectedFile();  
                    if(saveFileName==null || saveFileName.getName().equals(""))  
                    {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                    }  
                    else   
                    {   try  
                        {   FileWriter fw=new FileWriter(saveFileName);  
                            BufferedWriter bfw=new BufferedWriter(fw);  
                            bfw.write(editArea.getText(),0,editArea.getText().length());  
                            bfw.flush();//刷新该流的缓冲  
                            bfw.close();  
                            isNewFile=false;  
                            currentFile=saveFileName;  
                            oldValue=editArea.getText();  
                            this.setTitle(saveFileName.getName()+" - 记事本");  
                            statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());  
                        }  
                        catch (IOException ioException)  
                        {  
                        }  
                    }  
                }  
                else if(saveChoose==JOptionPane.NO_OPTION)  
                {   String str=null;  
                    JFileChooser fileChooser=new JFileChooser();  
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                    //fileChooser.setApproveButtonText("确定");  
                    fileChooser.setDialogTitle("打开文件");  
                    int result=fileChooser.showOpenDialog(this);  
                    if(result==JFileChooser.CANCEL_OPTION)  
                    {   statusLabel.setText("您没有选择任何文件");  
                        return;  
                    }  
                    File fileName=fileChooser.getSelectedFile();  
                    if(fileName==null || fileName.getName().equals(""))  
                    {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                    }  
                    else  
                    {   try  
                        {   FileReader fr=new FileReader(fileName);  
                            BufferedReader bfr=new BufferedReader(fr);  
                            editArea.setText("");  
                            while((str=bfr.readLine())!=null)  
                            {   editArea.append(str);  
                            }  
                            this.setTitle(fileName.getName()+" - 记事本");  
                            statusLabel.setText(" 当前打开文件:"+fileName.getAbsoluteFile());  
                            fr.close();  
                            isNewFile=false;  
                            currentFile=fileName;  
                            oldValue=editArea.getText();  
                        }  
                        catch (IOException ioException)  
                        {  
                        }  
                    }  
                }  
                else  
                {   return;  
                }  
            }  
            else  
            {   String str=null;  
                JFileChooser fileChooser=new JFileChooser();  
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                //fileChooser.setApproveButtonText("确定");  
                fileChooser.setDialogTitle("打开文件");  
                int result=fileChooser.showOpenDialog(this);  
                if(result==JFileChooser.CANCEL_OPTION)  
                {   statusLabel.setText(" 您没有选择任何文件 ");  
                    return;  
                }  
                File fileName=fileChooser.getSelectedFile();  
                if(fileName==null || fileName.getName().equals(""))  
                {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                }  
                else  
                {   try  
                    {   FileReader fr=new FileReader(fileName);  
                        BufferedReader bfr=new BufferedReader(fr);  
                        editArea.setText("");  
                        while((str=bfr.readLine())!=null)  
                        {   editArea.append(str);  
                        }  
                        this.setTitle(fileName.getName()+" - 记事本");  
                        statusLabel.setText(" 当前打开文件:"+fileName.getAbsoluteFile());  
                        fr.close();  
                        isNewFile=false;  
                        currentFile=fileName;  
                        oldValue=editArea.getText();  
                    }  
                    catch (IOException ioException)  
                    {  
                    }  
                }  
            }  
        }//打开结束  
        //保存  
        else if(e.getSource()==fileMenu_Save)  
        {   editArea.requestFocus();  
            if(isNewFile)  
            {   String str=null;  
                JFileChooser fileChooser=new JFileChooser();  
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
                //fileChooser.setApproveButtonText("确定");  
                fileChooser.setDialogTitle("保存");  
                int result=fileChooser.showSaveDialog(this);  
                if(result==JFileChooser.CANCEL_OPTION)  
                {   statusLabel.setText("您没有选择任何文件");  
                    return;  
                }  
                File saveFileName=fileChooser.getSelectedFile();  
                if(saveFileName==null || saveFileName.getName().equals(""))  
                {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
                }  
                else   
                {   try  
                    {   FileWriter fw=new FileWriter(saveFileName);  
                        BufferedWriter bfw=new BufferedWriter(fw);  
                        bfw.write(editArea.getText(),0,editArea.getText().length());  
                        bfw.flush();//刷新该流的缓冲  
                        bfw.close();  
                        isNewFile=false;  
                        currentFile=saveFileName;  
                        oldValue=editArea.getText();  
                        this.setTitle(saveFileName.getName()+" - 记事本");  
                        statusLabel.setText("当前打开文件:"+saveFileName.getAbsoluteFile());  
                    }  
                    catch (IOException ioException)  
                    {  
                    }  
                }  
            }  
            else  
            {   try  
                {   FileWriter fw=new FileWriter(currentFile);  
                    BufferedWriter bfw=new BufferedWriter(fw);  
                    bfw.write(editArea.getText(),0,editArea.getText().length());  
                    bfw.flush();  
                    fw.close();  
                }                             
                catch(IOException ioException)  
                {                     
                }  
            }  
        }//保存结束  
        //另存为  
        else if(e.getSource()==fileMenu_SaveAs)  
        {   editArea.requestFocus();  
            String str=null;  
            JFileChooser fileChooser=new JFileChooser();  
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);  
            //fileChooser.setApproveButtonText("确定");  
            fileChooser.setDialogTitle("另存为");  
            int result=fileChooser.showSaveDialog(this);  
            if(result==JFileChooser.CANCEL_OPTION)  
            {   statusLabel.setText(" 您没有选择任何文件");  
                return;  
            }                 
            File saveFileName=fileChooser.getSelectedFile();  
            if(saveFileName==null||saveFileName.getName().equals(""))  
            {   JOptionPane.showMessageDialog(this,"不合法的文件名","不合法的文件名",JOptionPane.ERROR_MESSAGE);  
            }     
            else   
            {   try  
                {   FileWriter fw=new FileWriter(saveFileName);  
                    BufferedWriter bfw=new BufferedWriter(fw);  
                    bfw.write(editArea.getText(),0,editArea.getText().length());  
                    bfw.flush();  
                    fw.close();  
                    oldValue=editArea.getText();  
                    this.setTitle(saveFileName.getName()+"  - 记事本");  
                    statusLabel.setText(" 当前打开文件:"+saveFileName.getAbsoluteFile());  
                }                         
                catch(IOException ioException)  
                {                     
                }                 
            }  
        }//另存为结束  
        //页面设置  
        else if(e.getSource()==fileMenu_PageSetUp)  
        {   editArea.requestFocus();  
            JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);  
        }//页面设置结束  
        //打印  
        else if(e.getSource()==fileMenu_Print)  
        {   editArea.requestFocus();  
            JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);  
        }//打印结束  
        //退出  
        else if(e.getSource()==fileMenu_Exit)  
        {   int exitChoose=JOptionPane.showConfirmDialog(this,"确定要退出吗?","退出提示",JOptionPane.OK_CANCEL_OPTION);  
            if(exitChoose==JOptionPane.OK_OPTION)  
            {   System.exit(0);  
            }  
            else  
            {   return;  
            }  
        }//退出结束  
        //编辑  
        //else if(e.getSource()==editMenu)  
        //{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性  
        //}  
        //编辑结束  
        //撤销  
        else if(e.getSource()==editMenu_Undo || e.getSource()==popupMenu_Undo)  
        {   editArea.requestFocus();  
            if(undo.canUndo())  
            {   try  
                {   undo.undo();  
                }  
                catch (CannotUndoException ex)  
                {   System.out.println("Unable to undo:" + ex);  
                    //ex.printStackTrace();  
                }  
            }  
            if(!undo.canUndo())  
                {   editMenu_Undo.setEnabled(false);  
                }  
        }//撤销结束  
        //剪切  
        else if(e.getSource()==editMenu_Cut || e.getSource()==popupMenu_Cut)  
        {   editArea.requestFocus();  
            String text=editArea.getSelectedText();  
            StringSelection selection=new StringSelection(text);  
            clipBoard.setContents(selection,null);  
            editArea.replaceRange("",editArea.getSelectionStart(),editArea.getSelectionEnd());  
            checkMenuItemEnabled();//设置剪切,复制,粘帖,删除功能的可用性  
        }//剪切结束  
        //复制  
        else if(e.getSource()==editMenu_Copy || e.getSource()==popupMenu_Copy)  
        {   editArea.requestFocus();  
            String text=editArea.getSelectedText();  
            StringSelection selection=new StringSelection(text);  
            clipBoard.setContents(selection,null);  
            checkMenuItemEnabled();//设置剪切,复制,粘帖,删除功能的可用性  
        }//复制结束  
        //粘帖  
        else if(e.getSource()==editMenu_Paste || e.getSource()==popupMenu_Paste)  
        {   editArea.requestFocus();  
            Transferable contents=clipBoard.getContents(this);  
            if(contents==null)return;  
            String text="";  
            try  
            {   text=(String)contents.getTransferData(DataFlavor.stringFlavor);  
            }  
            catch (Exception exception)  
            {  
            }  
            editArea.replaceRange(text,editArea.getSelectionStart(),editArea.getSelectionEnd());  
            checkMenuItemEnabled();  
        }//粘帖结束  
        //删除  
        else if(e.getSource()==editMenu_Delete || e.getSource()==popupMenu_Delete)  
        {   editArea.requestFocus();  
            editArea.replaceRange("",editArea.getSelectionStart(),editArea.getSelectionEnd());  
            checkMenuItemEnabled(); //设置剪切、复制、粘贴、删除等功能的可用性    
        }//删除结束  
        //查找  
        else if(e.getSource()==editMenu_Find)  
        {   editArea.requestFocus();  
            find();  
        }//查找结束  
        //查找下一个  
        else if(e.getSource()==editMenu_FindNext)  
        {   editArea.requestFocus();  
            find();  
        }//查找下一个结束  
        //替换  
        else if(e.getSource()==editMenu_Replace)  
        {   editArea.requestFocus();  
            replace();  
        }//替换结束  
        //转到  
        else if(e.getSource()==editMenu_GoTo)  
        {   editArea.requestFocus();  
            JOptionPane.showMessageDialog(this,"对不起,此功能尚未实现!更多请看http://pan.muyi.so","提示",JOptionPane.WARNING_MESSAGE);  
        }//转到结束  
        //时间日期  
        else if(e.getSource()==editMenu_TimeDate)  
        {   editArea.requestFocus();  
            //SimpleDateFormat currentDateTime=new SimpleDateFormat("HH:mmyyyy-MM-dd");  
            //editArea.insert(currentDateTime.format(new Date()),editArea.getCaretPosition());  
            Calendar rightNow=Calendar.getInstance();  
            Date date=rightNow.getTime();  
            editArea.insert(date.toString(),editArea.getCaretPosition());  
        }//时间日期结束  
        //全选  
        else if(e.getSource()==editMenu_SelectAll || e.getSource()==popupMenu_SelectAll)  
        {   editArea.selectAll();  
        }//全选结束  
        //自动换行(已在前面设置)  
        else if(e.getSource()==formatMenu_LineWrap)  
        {   if(formatMenu_LineWrap.getState())  
                editArea.setLineWrap(true);  
            else   
                editArea.setLineWrap(false);  
  
        }//自动换行结束  
        //字体设置  
        else if(e.getSource()==formatMenu_Font)  
        {   editArea.requestFocus();  
            font();  
        }//字体设置结束  
        //设置状态栏可见性  
        else if(e.getSource()==viewMenu_Status)  
        {   if(viewMenu_Status.getState())  
                statusLabel.setVisible(true);  
            else   
                statusLabel.setVisible(false);  
        }//设置状态栏可见性结束  
        //帮助主题  
        else if(e.getSource()==helpMenu_HelpTopics)  
        {   editArea.requestFocus();  
            JOptionPane.showMessageDialog(this,"路漫漫其修远兮,吾将上下而求索。","帮助主题",JOptionPane.INFORMATION_MESSAGE);  
        }//帮助主题结束  
        //关于  
        else if(e.getSource()==helpMenu_AboutNotepad)  
        {   editArea.requestFocus();  
            JOptionPane.showMessageDialog(this,  
                "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n"+  
                " 编写者:沐伊科技 \n"+  
                " 编写时间:2016-06-09                          \n"+  
                " 更多教程:http://pan.muyi.so (网盘资源教程应有尽有哦!)     \n"+  
                " e-mail:llqqxf@163.com                \n"+  
                " 一些地方借鉴他人,不足之处希望大家能提出意见,谢谢!  \n"+  
                "&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n",  
                "记事本",JOptionPane.INFORMATION_MESSAGE);  
        }//关于结束  
    }//方法actionPerformed()结束  
  
    //实现DocumentListener接口中的方法(与撤销操作有关)  
    public void removeUpdate(DocumentEvent e)  
    {   editMenu_Undo.setEnabled(true);  
    }  
    public void insertUpdate(DocumentEvent e)  
    {   editMenu_Undo.setEnabled(true);  
    }  
    public void changedUpdate(DocumentEvent e)  
    {   editMenu_Undo.setEnabled(true);  
    }//DocumentListener结束  
  
    //实现接口UndoableEditListener的类UndoHandler(与撤销操作有关)  
    class UndoHandler implements UndoableEditListener  
    {   public void undoableEditHappened(UndoableEditEvent uee)  
        {   undo.addEdit(uee.getEdit());  
        }  
    }  
  
    //main函数开始  
    public static void main(String args[])  
    {   Notepad notepad=new Notepad();  
        notepad.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//使用 System exit 方法退出应用程序  
    }//main函数结束  
}  

 

本次做这个记事本小程序,主要是为了学习Swing包中几个重要的类JFileChooser,JOptionPane,JMenu,当然也顺便巩固一下前面学的IO 流的知识。

一、简要介绍

1、JFileChooser

 JFileChooser为用户选择文件提供了一种简单机制,可弹出针对用户主目录的文件选择器。编写记事本程序主要用到了以下几种方法:

a.  showOpenDialog(Component parent) :弹出一个 "Open File" 文件选择器对话框,该文件选择器被弹下时返回一个int型数据,包括以下几种状态: 

         JFileChooser.CANCEL_OPTION         取消

        JFileChooser.APPROVE_OPTION      确认

        JFileChooser.ERROR_OPTION            如果发生错误或者该对话框已被解除 

b.  showSaveDialog(Component parent) : 弹出一个 "Save File" 文件选择器对话框,该文件选择器被弹下时返回一个int型数据,状态同上;

c. getSelectedFile()    返回选中的文件,返回值为File类型;

d. getName(File f) 返回文件名,返回值为String类型

2、JOptionPane

 1.1、用途:JOptionPane主要用来弹出要求用户提供值或向其发出通知的标准对话框。

 1.2、特点:所有对话框都是有模式的,在用户交互完成之前,每个 showXxxDialog 方法都一直阻塞调用者。

 1.3、基本类型:

    showConfirmDialog():  确认对话框 
                showInputDialog():         输入对话框 
                showMessageDialog():消息提示框 
                showOptionDialog():     选择对话框

     JOptionPane类方法众多,但基本上用起来都是对上述四种方法的单行调用。

1.4、参数介绍:

以下述方法为例:

<a href="https://blog.csdn.net/LIAO_7053/javax/swing/JOptionPane.html#showOptionDialog%28java.awt.Component,%20java.lang.Object,%20java.lang.String,%20int,%20int,%20javax.swing.Icon,%20java.lang.Object%5B%5D,%20java.lang.Object%29">showOptionDialog</a>(<a href="https://blog.csdn.net/LIAO_7053/java/awt/Component.html">Component</a> parentComponent, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a> message, <a href="https://blog.csdn.net/LIAO_7053/java/lang/String.html">String</a> title, int optionType, int messageType, <a href="https://blog.csdn.net/LIAO_7053/javax/swing/Icon.html">Icon</a> icon, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>[] options, <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a> initialValue)参数描述类型parentComponent对话框所在容器 <a href="https://blog.csdn.net/LIAO_7053/java/awt/Component.html">Component</a>message消息 <a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>title对话框标题 <a href="https://blog.csdn.net/LIAO_7053/java/lang/String.html">String</a>optionType选择按钮类型 

int: DEFAULT_OPTION          YES_NO_OPTION  

     YES_NO_CANCEL_OPTION    OK_CANCEL_OPTION 

messageType消息类型 

int:ERROR_MESSAGE      INFORMATION_MESSAGE   WARNING_MESSAGE

     QUESTION_MESSAGE   PLAIN_MESSAGE

icon自定义消息图标 <a href="https://blog.csdn.net/LIAO_7053/javax/swing/Icon.html">Icon</a>options操作选项<a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>[]initialValue默认选择<a href="https://blog.csdn.net/LIAO_7053/java/lang/Object.html">Object</a>

有关JOptionPane的具体用法可参考源代码或者下面这篇博客:

https://blog.csdn.net/tjk123456/article/details/77868034

3、JMenu

3.1、菜单分为下拉式菜单和弹出式菜单(JPopupMenu),其中下拉式菜单需要使用三个组件:JMenuBar(菜单栏)、JMenu(菜单)、JMenuItem(菜单项)。

3.2、JMenuBar:

          a.  JMenuBar表示一个水平的菜单栏,用来管理菜单,不参与用户交互操作;

          b.  可通过调用setJMenuBar( )方法将JMenuBar设置在顶级窗口的顶部;

          c.   可通过调用add( JMenu menu)方法添加菜单。

3.3、 JMenu

        a.  JMenu 表示一个菜单,用来整理菜单项;

        b.  通过调用add( )方法可向菜单里面添加菜单项或者菜单、按钮等;

        c.  通过调用addSeparator( )方法可向菜单栏里面添加分隔符。

3.4、 JMenuItem

        a.  JMenuIten表示菜单项,是菜单系统中最基本的组件;

        b. JMenuIten继承AbstractButton类,因此可以把它看作一个按钮。

二、记事本功能实现

1、实现了记事本的文件打开和保存功能(主要功能);

2、更换了标题栏默认的java图标,改成记事本图标;

3、重写了窗体关闭事件方法,点击关闭按钮时,先做文件是否保存判断,若文件已保存则直接退出程序,否则弹出是否保存文件对话框;

4、记事本输入框采用滚动条加文本框设计;

5、文中多次运用JOptionPane和JFileChooser对话框,尽量做到与windows运行机制一样,包含大量操作提示信息;

6、实现了文件读取、写入、命名、路径选择等功能;

三、代码实现

package com.liao.notepad0822;
 
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStreamWriter;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 
public class MainUI extends JFrame {
 
	private static final long serialVersionUID = -8533346717300013642L;
	private JTextArea jta;
	private JScrollPane jsp;
	private static String name;
	private JFileChooser jfc = new JFileChooser();
 
	public static void main(String[] args) {
		new MainUI().init();
	}
 
	// 初始化界面
	public void init() {
		setSize(800, 600);
		setLocationRelativeTo(null);
		// 设置关闭按钮动作不执行任何操作
		setDefaultCloseOperation(0);
		name = "新建文本文档.txt";
		// 设置标志图案
		ImageIcon ii = new ImageIcon("file\\1.png");
		setIconImage(ii.getImage());
		// 设置文件名
		setTitle(name + " - 记事本");
		// 添加菜单栏
		addMenu();
		// 添加文本框
		jta = new JTextArea();
		// 添加滚动条
		jsp = new JScrollPane(jta);
		jsp.setPreferredSize(new Dimension(780, 550));
		add(jsp, BorderLayout.CENTER);
		setVisible(true);// 设置窗口可见
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				if (showSaveDialog() != JOptionPane.CANCEL_OPTION)// 若不是取消按钮,关闭程序
					setDefaultCloseOperation(3);
			}
		});
	}
 
	// 添加菜单栏
	private void addMenu() {
		// 添加菜单栏
		JMenuBar jmb = new JMenuBar();
		// 设置菜单栏位置在顶级窗口的顶部
		setJMenuBar(jmb);
		// 菜单栏菜单
		JMenu jm_file = new JMenu("文件");
		JMenu jm_edit = new JMenu("编辑");
		jmb.add(jm_file);
		jmb.add(jm_edit);
		// 给文件菜单添加菜单项
		JMenuItem item1 = new JMenuItem("打开");
		JMenuItem item2 = new JMenuItem("保存");
		jm_file.add(item1);
		jm_file.add(item2);
 
		// "打开"菜单项添加动作监听器
		item1.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 是否保存对原文件修改
				if (showSaveDialog() == JOptionPane.CANCEL_OPTION) {// 取消按钮,则返回
					return;
				}
				// 弹出一个 "Open File" 文件选择器对话框
				int select = jfc.showOpenDialog(MainUI.this);
				// 选择打开文件,则读写文件
				if (select == JFileChooser.APPROVE_OPTION) {
					jta.setText(readFile());// 写入文本框
					jta.setCaretPosition(0);// 定位光标至行首
				}
			}
		});
 
		// “保存”菜单项添加动作监听器
		item2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (jfc.getSelectedFile() == null) {
					createFile();//调用创建文件方法
				} else {
					showSaveDialog();//调用文件是否保存方法
				}
			}
		});
	}
 
	// 读取文件
	private String readFile() {
		// 声明缓冲字符流变量
		BufferedReader br = null;
		StringBuilder sb = null;
		try {
			br = new BufferedReader(new FileReader(jfc.getSelectedFile()));
			sb = new StringBuilder();// 创建缓冲字符串
			String str;
			int count = 0;//控制添加换行符,与原文保持一致
			while ((str = br.readLine()) != null) {
				if (count == 0)
					sb.append(str);
				if (count++ != 0)
					sb.append("\n" + str);// 添加换行
			}
		} catch (FileNotFoundException e1) {
			// 弹出“文件未找到”对话框,返回null
			JOptionPane.showMessageDialog(null, "未找到该文件!");
			return null;
		} catch (IOException e1) {
			// 弹出“文件读取异常”对话框,返回null
			JOptionPane.showMessageDialog(null, "文件读取异常");
			return null;
		} finally {
			// 关闭字符流
			if (br != null)
				try {
					br.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
		}
		name = jfc.getSelectedFile().getName();
		setTitle(name + " - 记事本");//设置文件名
		return sb.toString();
	}
 
	// 保存对话框
	private int showSaveDialog() {
		int select = 0;
		// 判断文本框是否为空
		if (!jta.getText().equals("")) {
			// 判断文件是否为空
			if (jfc.getSelectedFile() == null) {
				select = JOptionPane.showConfirmDialog(MainUI.this, "是否保存修改?");
				if (select == JOptionPane.YES_OPTION) {
					createFile();//文件不存在,则创建文件
				}
			} else {
				if (!isSaved()) {// 文件未保存
					select = JOptionPane.showConfirmDialog(MainUI.this, "是否保存修改?");
					if (select == JOptionPane.YES_OPTION) {
						saveFile(jfc.getSelectedFile());
					}
				}
			}
		}
		return select;// 返回选项
	}
 
	// 创建新文件
	private void createFile() {
		// String name = null;
		File file = null;
		// 选择保存或取消
		if (jfc.showSaveDialog(MainUI.this) == JFileChooser.APPROVE_OPTION) {
			file = jfc.getSelectedFile();// 获取选中的文件
		} else {
			return;
		}
		name = jfc.getName(file);// 获取输入的文件名
		if (file.exists()) { // 若选择已有文件----询问是否要覆盖
			int i = JOptionPane.showConfirmDialog(null, "该文件已存在,是否覆盖原文件", "确认", JOptionPane.YES_NO_OPTION);
			if (i == JOptionPane.YES_OPTION) {
				saveFile(file);
			} else {
				jfc.showSaveDialog(MainUI.this);// 重新选择
			}
		} else {//文件不存在,则直接保存
			saveFile(file);
		}
	}
 
	// 判断文件是否保存
	private Boolean isSaved() {
		// 比较内容
		if (jta.getText().equals(readFile())) {
			return true;
		}
		return false;
	}
 
	// 保存文件,文件不存在则创建新文件
	private void saveFile(File file) {
		BufferedWriter bw = null;
		try {
			bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
			bw.write(jta.getText());//写入文件
			bw.flush();
		} catch (FileNotFoundException e1) {
			JOptionPane.showMessageDialog(MainUI.this, "文件保存出错" + e1.getMessage());
		} catch (IOException e1) {
			e1.printStackTrace();
		} finally {
			try {
				if (bw != null)
					bw.close();
			} catch (IOException e1) {
			}
		}
	}
}

四、小结

此次编写记事本程序,基本完成了预期目标,熟悉了解了菜单栏、标题栏、对话框、JFileChooser,JOptionPane以及IO流的相关知识。不过花费的时间略微超过了预期,主要是记事本这个程序看着简单,但实际上对逻辑上的要求比较高。主体功能实现后,后期的一些细节处理往往需要大量的时间去测试、整理及优化。

这里有个小细节需要注意一下,使用reaLline()读取数据时,要特别注意换行符的使用,保持跟原文结构一样。

好了,由于本次写记事本主要是为了熟悉Swing里面的几个类,所以记事本其它的一些功能并未去实现,各位有兴趣的话可以自己去尝试!