zoukankan      html  css  js  c++  java
  • Java记录之简易记事本

    仿照windows记事本,制作一个记事本软件,实现纯文本文件的新建、打开、保存、另存、复制、粘贴、查找、替换、关于等功能。

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import java.awt.datatransfer.*;
    public class Window extends JFrame implements ActionListener,DocumentListener{
        //系统剪贴板
         Toolkit toolkit=Toolkit.getDefaultToolkit();
         Clipboard clipBoard=toolkit.getSystemClipboard();
         //用来复制粘贴
        //右键弹出菜单项
         JPopupMenu popupMenu;
         JMenuItem popupMenu_Undo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;
         String oldValue;//存放编辑区原来的内容,用于比较文本是否有改动
         boolean isNewFile=true;//是否新文件(未保存过的)
         File currentFile;//当前文件名
         File file = null;
         JMenuBar bar;
         JLabel label;//其他变量
         JMenu files ,edit, form ,look ,help;
         JMenuItem news,open,save, saves, copy ,paste ,find, replace,replaceAll,cut;
         JTextArea editArea;
         
         
         Window(){
             setTitle("记事本");
             files = new JMenu("文件");
             edit = new JMenu("编辑");
             form =new JMenu("格式");
             look =new JMenu("查看");
             help =new JMenu("帮助");
             news = new JMenuItem("新建");
             open = new JMenuItem("打开");
             save = new JMenuItem("保存");
             saves = new JMenuItem("另存");
             copy = new JMenuItem("复制");
             cut = new JMenuItem("剪切");
             paste = new JMenuItem("粘贴");
             find = new JMenuItem("查找");
             replace = new JMenuItem("替换");
            // replaceAll = new JMenuItem("全部替换");
             bar = new JMenuBar();
             
             
             files.add(news);
             news.addActionListener(this);//添加监听器
             files.add(saves);
             saves.addActionListener(this);
             files.add(open);
             open.addActionListener(this);
             
             files.add(save);
             save.addActionListener(this);
             files.add(find);
             find.addActionListener(this);
             form.add(replace);
             replace.addActionListener(this);
            // form.add(replaceAll);
             //replaceAll.addActionListener(this);
             edit.add(copy);
             copy.addActionListener(this);
             edit.add(paste);
             paste.addActionListener(this);
             files.add(cut);
             cut.addActionListener(this);
             bar.add(files);
             bar.add(edit); 
             bar.add(form);
             bar.add(look);
             bar.add(help);
             setJMenuBar(bar);
             
             //文本区
             editArea = new JTextArea(200,300);
             JScrollPane scroll = new JScrollPane (editArea);
             editArea.setWrapStyleWord(true);//设置单词在一行不足容纳时换行
             editArea.setLineWrap(true);//设置文本编辑区自动换行默认为true,即会"自动换行"
             add(editArea);
             
             popupMenu = new JPopupMenu();
             //popupMenu_Undo=new JMenuItem("撤销");
             popupMenu_Cut=new JMenuItem("剪切");
             popupMenu_Copy=new JMenuItem("复制");
            popupMenu_Paste=new JMenuItem("粘帖");
             popupMenu_Delete=new JMenuItem("删除");
             popupMenu_SelectAll=new JMenuItem("全选");
            //向右键菜单添加菜单项和分隔符
            // 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();//编辑区获取焦点
             }
             });//文本编辑区注册右键菜单事件结束
             
             
             
            //添加窗口监听器
             addWindowListener(new WindowAdapter()
             { public void windowClosing(WindowEvent e)
             { editArea.requestFocus();
             String currentValue=editArea.getText();
             //System.out.println(oldValue);
             if(currentValue.equals(oldValue)==true)//判断是否为新文件
             { System.exit(0);
             }
             else {
                  exitWindowChoose();
             }
             }
             });
             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
             setVisible(true);
             setBounds(100,50,420,380);
             validate();
             
         }//构造方法结束
         
         
         
         //关闭窗口时判断新建
         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){ 
                 JFileChooser fileDialog = new JFileChooser();
                 int state = fileDialog.showSaveDialog(this);
                 if(state == JFileChooser.APPROVE_OPTION) {
                     try {
                         File dir = fileDialog.getCurrentDirectory();
                         String name = fileDialog.getSelectedFile().getName();
                         File file = new File(dir,name);
                         FileWriter fileWriter = new FileWriter(file);
                         BufferedWriter out = new BufferedWriter(fileWriter);
                         out.write(editArea.getText());
                         out.close();
                         fileWriter.close();
                     }
                     catch(IOException e) { }
                                          
             } } } }          
         }
         
         
             
         
        @Override
        public void actionPerformed(ActionEvent e ) {
            if(e.getSource()==copy||e.getSource()==popupMenu_Copy) {//复制粘贴剪切
                editArea.copy();
            }
            if(e.getSource()==popupMenu_SelectAll) {
                editArea.select(0,editArea.getText().length());
            }
            if(e.getSource()==cut||e.getSource()==popupMenu_Cut) {
                editArea.cut();
            }
            if(e.getSource()==paste||e.getSource()==popupMenu_Paste) {
                editArea.paste();
            }
            //打开或新建
            if(e.getSource()==open||e.getSource()==news) {
                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){ 
                     JFileChooser fileDialog = new JFileChooser();
                     int state = fileDialog.showSaveDialog(this);
                     if(state == JFileChooser.APPROVE_OPTION) {
                         try {
                             File dir = fileDialog.getCurrentDirectory();
                             String name = fileDialog.getSelectedFile().getName();
                             File file = new File(dir,name);
                             FileWriter fileWriter = new FileWriter(file);
                             BufferedWriter out = new BufferedWriter(fileWriter);
                             out.write(editArea.getText());
                             out.close();
                             fileWriter.close();
                         }
                         catch(IOException ex) { }
                                              
                 }} }
                 } 
                }    
            if(e.getSource()==find) {
                final JDialog findDialog=new JDialog(this,"查找",false);//false时允许其他窗口同时处于激活状态(即无模式)
                 Container con=findDialog.getContentPane();//返回此对话框的contentPane对象 
                 con.setLayout(new FlowLayout(FlowLayout.LEFT));
                 JLabel findContentLabel=new JLabel("查找内容:");
                 final JTextField findText=new JTextField(15);
                 JButton findNextButton=new JButton("查找下一个:");
                 final JCheckBox matchCheckBox=new JCheckBox("区分大小写");
                 ButtonGroup bGroup=new ButtonGroup();
                 final JRadioButton upButton=new JRadioButton("向上");
                 final JRadioButton downButton=new JRadioButton("向下");
                 downButton.setSelected(true);
                 bGroup.add(upButton);
                 bGroup.add(downButton);
                 /*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())
                 { 
                  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)
                  { 
                  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)
                  { 
                  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);
                 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);
            }
            if(e.getSource()==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())
                { 
                 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)
                 { 
                 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(findText.getText().length()==0)
                    { JOptionPane.showMessageDialog(replaceDialog,"请填写查找内容!","提示",JOptionPane.WARNING_MESSAGE);
                     findText.requestFocus(true);
                     return;
                    }
                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)
                 { 
                 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)
                 { 
                 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组件的边框;
                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 checkMenuItemEnabled()
         { String selectText=editArea.getSelectedText();
         if(selectText==null)
         { cut.setEnabled(false);
         popupMenu_Cut.setEnabled(false);
         copy.setEnabled(false);
         popupMenu_Copy.setEnabled(false);
        // delete.setEnabled(false);
         popupMenu_Delete.setEnabled(false);
         }
         else
         { cut.setEnabled(true);
         popupMenu_Cut.setEnabled(true); 
         copy.setEnabled(true);
         popupMenu_Copy.setEnabled(true);
         //editMenu_Delete.setEnabled(true);
         popupMenu_Delete.setEnabled(true);
         }
         //粘帖功能可用性判断
         Transferable contents=clipBoard.getContents(this);
         if(contents==null)
         { paste.setEnabled(false);
         popupMenu_Paste.setEnabled(false);
         }
         else
         { paste.setEnabled(true);
         popupMenu_Paste.setEnabled(true); 
         }
         }//方法checkMenuItemEnabled()结束
        @Override
        public void changedUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void insertUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            
        }
        @Override
        public void removeUpdate(DocumentEvent e) {
            // TODO Auto-generated method stub
            
        }
        
    }
  • 相关阅读:
    tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
    HDU4292(KB11-H 最大流)
    HDU4280(KB11-G 最大流)
    POJ1149(最大流)
    POJ3281(KB11-B 最大流)
    POJ3436(KB11-A 最大流)
    Codeforces841B
    Codeforces841A
    HDU2255(KB10-K 二分图最大权匹配)
    HDU1281(KB10-D 二分图最大匹配)
  • 原文地址:https://www.cnblogs.com/zhuimingzhenbai/p/12951057.html
Copyright © 2011-2022 走看看