swing写的记事本

 

package com.company.thread5.test;

 


import  javax.swing. * ;
import  java.io. * ;
import  java.awt. * ;
import  java.awt.event. * ;

public   class  NotePad  extends  JFrame  implements  ActionListener,ItemListener
 {
    boolean  haveCreated = false ;
   File file = null ;
   String strtext = "" ;
    int  findIndex = 0 ;
   String findStr;
  
     JMenuBar menubar    =   new  JMenuBar();
   JMenu meFile        =   new  JMenu( " 文件 " );
   JMenu meEdit        =   new  JMenu( " 编辑 " );
   JMenu meStyle       =   new  JMenu( " 风格 " );
   JMenu meHelp        =   new  JMenu( " 帮助 " );
      
   JMenuItem miCreate  =   new  JMenuItem( " 新建 " );   
   JMenuItem miOpen    =   new  JMenuItem( " 打开 " );   
   JMenuItem miSave    =   new  JMenuItem( " 保存 " );   
   JMenuItem miSaveAs  =   new  JMenuItem( " 另存为 " );   
   JMenuItem miExit    =   new  JMenuItem( " 退出 " );   
  
   JMenuItem miUndo    =   new  JMenuItem( " 撤消 " );   
   JMenuItem miCut     =   new  JMenuItem( " 剪切 " );   
   JMenuItem miCopy    =   new  JMenuItem( " 复制 " );   
   JMenuItem miPaste   =   new  JMenuItem( " 粘贴 " );   
   JMenuItem miDelete  =   new  JMenuItem( " 删除 " );   
   JMenuItem miFind    =   new  JMenuItem( " 查找 " );   
   JMenuItem miNext    =   new  JMenuItem( " 查找下一个 " );   
   JMenuItem miReplace =   new  JMenuItem( " 替换 " );
  
    // 右键弹出菜单项
    JMenuItem pmUndo    =   new  JMenuItem( " 撤消 " );
   JMenuItem pmCut     =   new  JMenuItem( " 剪切 " );       
   JMenuItem pmCopy    =   new  JMenuItem( " 复制 " );       
   JMenuItem pmPaste   =   new  JMenuItem( " 粘贴 " );       
   JMenuItem pmDelete  =   new  JMenuItem( " 删除 " );
  
   JCheckBoxMenuItem miNewLine =   new  JCheckBoxMenuItem( " 自动换行 " );
   JMenu smLookFeel    =   new  JMenu( " 观感 " );
   JMenuItem metal     =   new  JMenuItem( " Metal " );
   JMenuItem motif     =   new  JMenuItem( " Motif " );
   JMenuItem windows   =   new  JMenuItem( " Windows " );
      
   JMenuItem miAbout   =   new  JMenuItem( " 关于 " );
  
   JPopupMenu popupMenu;   
   JTextArea text      =   new  JTextArea();

      
    public  NotePad()
     {
        super ( " 我的记事本 " );
        // 为便于区分事件源,设定名字
        miCreate.setActionCommand( " create " );
       miOpen.setActionCommand( " open " );
       miSave.setActionCommand( " save " );
       miSaveAs.setActionCommand( " saveAs " );
       miExit.setActionCommand( " exit " );       
      
       miUndo.setActionCommand( " undo " );
       miCut.setActionCommand( " cut " );
       miCopy.setActionCommand( " copy " );
       miPaste.setActionCommand( " paste " );
       miDelete.setActionCommand( " delete " );
       miFind.setActionCommand( " find " );
       miNext.setActionCommand( " next " );
       miReplace.setActionCommand( " replace " );
      
       miNewLine.setActionCommand( " newLine " );   
       miAbout.setActionCommand( " about " );
      
       pmUndo.setActionCommand( " undo " );
       pmCut.setActionCommand( " cut " );
       pmCopy.setActionCommand( " copy " );
       pmPaste.setActionCommand( " paste " );
       pmDelete.setActionCommand( " delete " );
      
        this .setSize( 500 , 500 );
        this .setLocation( 300 , 150 );
        this .setJMenuBar(menubar);
      
       meFile.setFont( new  Font( " 宋体 " ,Font.BOLD, 15 ));
       meEdit.setFont( new  Font( " 宋体 " ,Font.BOLD, 15 ));
       meStyle.setFont( new  Font( " 宋体 " ,Font.BOLD, 15 ));
       meHelp.setFont( new  Font( " 宋体 " ,Font.BOLD, 15 ));
      
       menubar.add(meFile);
       menubar.add(meEdit);
       menubar.add(meStyle);
       menubar.add(meHelp);
      
       meFile.add(miCreate);
       meFile.add(miOpen);
       meFile.add(miSave);
       meFile.add(miSaveAs);
       meFile.addSeparator();
       meFile.add(miExit);   
      
       meEdit.add(miUndo);
       meEdit.addSeparator();       
       meEdit.add(miCut);
       meEdit.add(miCopy);
       meEdit.add(miPaste);
       meEdit.add(miDelete);
       meEdit.addSeparator();
       meEdit.add(miFind);
       meEdit.add(miNext);
       meEdit.addSeparator();
       meEdit.add(miReplace);
      
       meStyle.add(miNewLine);
       meStyle.add(smLookFeel);
       smLookFeel.add(metal);
       smLookFeel.add(motif);
       smLookFeel.add(windows);
      
       meHelp.add(miAbout);
        // 添加到右键弹出菜单
        popupMenu = new  JPopupMenu();
       popupMenu.add(pmUndo);
       popupMenu.addSeparator();
       popupMenu.add(pmCut);
       popupMenu.add(pmCopy);
       popupMenu.add(pmPaste);
       popupMenu.add(pmDelete);
        // 添加按钮事件监听
        meHelp.addActionListener( this );
       miCreate.addActionListener( this );
       miOpen.addActionListener( this );
       miSave.addActionListener( this );
       miSaveAs.addActionListener( this );
       miExit.addActionListener( this );
      
       miUndo.addActionListener( this );
       miCut.addActionListener( this );
       miCopy.addActionListener( this );
       miPaste.addActionListener( this );
       miDelete.addActionListener( this );
       miFind.addActionListener( this );
       miNext.addActionListener( this );
       miReplace.addActionListener( this );
      
       miNewLine.addItemListener( this );               
       miAbout.addActionListener( this );
       metal.addActionListener( this );
       motif.addActionListener( this );
       windows.addActionListener( this );
      
        // 添加右键按钮事件监听器
        pmUndo.addActionListener( this );
       pmCut.addActionListener( this );
       pmCopy.addActionListener( this );
       pmPaste.addActionListener( this );
       pmDelete.addActionListener( this );
      
        // 文本区内容没有选中时某些按钮不可用
        miCut.setEnabled( false );
       miCopy.setEnabled( false );
       miDelete.setEnabled( false );
      
       pmCut.setEnabled( false );
       pmCopy.setEnabled( false );
       pmDelete.setEnabled( false );
          
       JScrollPane scrollPane  = new  JScrollPane(text);   
       getContentPane().add(scrollPane, "Center" );
       text.setFont( new  Font( " Fixedsys " ,Font.TRUETYPE_FONT, 15 ));               
       setVisible( true );
      
        // 添加键盘输入监听器
        text.addFocusListener( new  MyFocusAdapter());
        // 添加鼠标监听器,用于激活右键弹出菜单
        text.addMouseListener( new  MouseAdapter()
             {
                public   void  mouseReleased(MouseEvent e)
                 {
                    if (e.isPopupTrigger())
                     {
                       popupMenu.show(e.getComponent(),e.getX(),e.getY());
                   }
               }
           } );
        // 添加窗口关闭监听器    
        addWindowListener( new  WindowAdapter()
             {
                public   void  windowClosing(WindowEvent e)
                 { // 询问是否保存时选择撤消
                     int  i;
                    if ( (i = askForSave()) == 3 )
                     {
                        return ;   
                   }
                   System.exit( 0 );                   
               }
           } );       
          
  
   }
// Methods /
    // 打开
     public   void  open()
     {       
       JFileChooser jc  = new  JFileChooser();
       jc.showOpenDialog( this );
       File f  =  jc.getSelectedFile();
        if (f == null ) // 没有选择文件则退出
           {
            return ;
       }
       file = f; // file 是File类的对象,为本类属性,在保存当前内容时用
         this .setTitle(f.getName() + " --记事本 " );       
       FileReader fr = null ;
        int  len = ( int )f.length();
        char [] ch = new   char [len];
        int  num = 0 ;
        try
          {
           fr =   new  FileReader(f);
            while (fr.ready())
             {
               num += fr.read(ch,num,len - num);
           }
            // 保存在属性strtext中,为了便于撤消恢复及监视内容是否改变            
            strtext = new  String(ch, 0 ,num);
           haveCreated = false ;
           text.setText(strtext);
       }
        catch (Exception e)
         {
           JOptionPane.showMessageDialog( this , " 出错:  " + e.getMessage());
       }
        finally
          {
            try
              {
               fr.close();               
           }
            catch (IOException e)
             {
               JOptionPane.showMessageDialog( this , " 出错:  " + e.getMessage());
           }
       }        
   }
    // 保存
     public   void  save(File f)
     {
       String saveStr = text.getText();
       FileWriter fw = null ;
        try
          {
           fw =   new  FileWriter(f);
           fw.write(saveStr);
           fw.flush();
       }
        catch (Exception e)
         {
           JOptionPane.showMessageDialog( this , " 出错:  " + e.getMessage());
       }
        finally
          {
            try
              {
               fw.close();               
           }
            catch (IOException e)
             {
               JOptionPane.showMessageDialog( this , " 出错:  " + e.getMessage());
           }
       }
       haveCreated = false ;
       JOptionPane.showMessageDialog( this , " 文件保存成功! " );       
   }
    // 另存为
     public   void  saveAs()
     {
       JFileChooser fs  = new  JFileChooser();
       fs.showSaveDialog( this );
       File f  =  fs.getSelectedFile();
        if (f != null )
         {
           save(f);
            this .setTitle(f.getName() + " --记事本 " );
           file = f;
       }
      
   }
     /** */ /** 如果显示的文件内容与原来有改变,询问是否保存
    * @return  int 0: no operation  1:yes  2:no   3:cancel -1:error return
     */
    public   int  askForSave()
     {   
        if (haveCreated && text.getText() == "" )
         {
            return   0 ;
       }
      
        if (text.getText().equals(strtext) == false )
         {
           String fn;
            if (file != null )
             {
               fn = "" + file.getName();
           }
            else
              {
               fn = " 未命名 " ;
           }
            int  i = JOptionPane.showConfirmDialog( this , " 文件 " + fn + " 的文字已经改变。 " +
            " /n要保存文件吗? " , " 记事本 " ,JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE);
          
            if (i == JOptionPane.YES_OPTION)
             {
                if (file == null )
                 {
                   saveAs();
               }
                else
                  {
                   save(file);
               }
                return   1 ;
              
           }
            if (i == JOptionPane.NO_OPTION)
             {
                return   2 ;
           }
            if (i == JOptionPane.CANCEL_OPTION)
             {
                return   3 ;
           }
       }
        return   - 1 ;
   }
    // 查找
     public   void  find(String str,  int  cur)
     {
        int  i = text.getText().indexOf(str,cur);
        if (i >= 0 )
         {
            this .text.setSelectionStart(i); // 使找到的字符串反白选中
             this .text.setSelectionEnd(i + str.length());
           findIndex =++ i; // 用于查找下一个
        }
        else
          {
           JOptionPane.showMessageDialog( this , " 查找完毕! " ,  " 记事本 " ,
               JOptionPane.OK_OPTION  +  JOptionPane.INFORMATION_MESSAGE);   
       }    
   }
    // 替换全部
     public   void  replaceAll(String fromStr,String toStr, int  cur, int  end)
     {
        if (cur > end)
         {       
            return ;
       }
        else
          {   
            int  i = text.getText().indexOf(fromStr,cur);       
            if (i >= 0 )
             {
               text.setSelectionStart(i); // 使找到的字符串反白选中
                text.setSelectionEnd(i + fromStr.length());
               text.replaceSelection(toStr); // 替换
                cur =++ i;
           }
            else
              {
               JOptionPane.showMessageDialog( this , " 替换完毕! " ,  " 记事本 " ,
               JOptionPane.OK_OPTION  +  JOptionPane.INFORMATION_MESSAGE);
                return ;   
           }
           replaceAll(fromStr,toStr,cur,end);  // 递归查找与替换
        }
   }
    // 切换观感    
     public   void  changeLookFeel(Component c, String plafName)
     {
        try
          {
           UIManager.setLookAndFeel(plafName);   
           SwingUtilities.updateComponentTreeUI(c);
       }
        catch (Exception e)
         {
           JOptionPane.showMessageDialog( this , " 观感加载失败! " , " 记事本 " ,
               JOptionPane.YES_OPTION + JOptionPane.INFORMATION_MESSAGE);
       }
   }
实现监听类的方法(本类实现了相应接口) // /


    public   void  itemStateChanged(ItemEvent e)
     {
        if (e.getStateChange() == e.SELECTED)
         {
           text.setLineWrap( true );
       }
        else
          {
           text.setLineWrap( false );
       }
   }
  
    public   void  actionPerformed(ActionEvent e)
     {
       String com = e.getActionCommand();
        if (com.equals( " create " ))
         {     // 当前显示的文件内容如有改变,询问是否保存
            // 返回:询问是否保存时选择否       
            // 返回3:询问是否保存时选择撤消
             int  i;
            if ((i = askForSave()) == 3 )
             {
                return ;
           }        
           text.setText( "" );
           file = null ;
            this .setTitle( " 未命名--记事本 " );
           strtext = "" ;                   
           haveCreated = true ;       
       }
        if (com.equals( " open " ))
         { // 询问是否保存时选择撤消
             int  i;
            if ((i = askForSave()) == 3 )
             {
                return ;
           }        
           open();
           strtext = text.getText();
       }
        if (com.equals( " saveAs " ))
         {
           saveAs();
           strtext = text.getText();
       }
        if (com.equals( " save " ))
         {
            if (haveCreated || file == null )
             {
               saveAs();
           }
            else
              {
               save(file);
           }
           strtext = text.getText();           
       }
        if (com.equals( " undo " ))
         {
           text.setText(strtext);
       }
        if (com.equals( " cut " ))
         {
            // 先保存文本区内容,供撤消后恢复使用
            strtext = text.getText();
           text.cut();   
       }
        if (com.equals( " copy " ))
         {
           text.copy();
       }
        if (com.equals( " paste " ))
         {
           strtext = text.getText();
           text.paste();
       }
        if (com.equals( " delete " ))
         {
           strtext = text.getText();
           text.replaceSelection( "" );
       }
        if (com.equals( " find " ))
         {   
           findIndex = 0 ;           
           FindDialog fd  =   new  FindDialog( this );                   
       }
        if (com.equals( " next " ))
         {
            // 没有选中内容则从头开始查找
            String str  =  text.getSelectedText();
            if (str == "" || str == null )
             {
               findIndex = 0 ;
           }
            if (str == null )
             {
               FindDialog fd  =   new  FindDialog( this );
           }
            else
              {
               find(str,text.getSelectionStart() + 1 );
           }    
       }
        if (com.equals( " replace " ))
         {
           ReplaceDialog rd  =   new  ReplaceDialog( this );
       }        
        if (com.equals( " about " ))
         {
           JOptionPane.showMessageDialog( this , " 我的记事本  V1.0/n作者:ZhiJian Zhang /n2005/5/25 Copyright " ,
                " 关于我的记事本 " ,JOptionPane.OK_OPTION + JOptionPane.INFORMATION_MESSAGE);
       }    
        // 观感选择
         if (e.getActionCommand().equals( " Metal " ))
         {
           String metal_str = " javax.swing.plaf.metal.MetalLookAndFeel " ;
           changeLookFeel( this ,metal_str);
       }
        if (e.getActionCommand().equals( " Motif " ))
         {
           String motif_str = " com.sun.java.swing.plaf.motif.MotifLookAndFeel " ;
           changeLookFeel( this ,motif_str);
       }
        if (e.getActionCommand().equals( " Windows " ))
         {
            // String windows_str="com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel"
            String windows_str = " com.sun.java.swing.plaf.windows.WindowsLookAndFeel " ;
           changeLookFeel( this ,windows_str);   
       }                    
        if (e.getActionCommand().equals( " exit " ))
         {
            int  i;
            if ( (i = askForSave()) == 3 )
             {
                return ;
           }
           System.exit( 0 );
       }        
   }
// /内部监听类
// 监听文本区变动
     class  MyFocusAdapter  extends  FocusAdapter
     { // 如果文本区没有选中的内容,则相应菜单项不可用
         public   void  focusLost(FocusEvent e)
         {
           String str  =  text.getSelectedText();
            if (str != "" && str != null )
             {
                // 菜单项
                miCut.setEnabled( true );
               miCopy.setEnabled( true );
               miDelete.setEnabled( true );
                // 右键菜单项
                pmCut.setEnabled( true );
               pmCopy.setEnabled( true );
               pmDelete.setEnabled( true );
           }
            else
              {
               miCut.setEnabled( false );
               miCopy.setEnabled( false );
               miDelete.setEnabled( false );
          
               pmCut.setEnabled( false );
               pmCopy.setEnabled( false );
               pmDelete.setEnabled( false );   
           }            
       }
   }    
    public   static   void  main(String[] args)
     {
       NotePad nt  =   new  NotePad();
      
   }
  
} // End of main class

// 外部类
/查找对对话框类
class  FindDialog  extends  JDialog  implements  ActionListener
 {
    // 引入np属性是为了通过构造器的参数传入NotePad的对象,
    // 从而方便访问其内部属性与方法
    NotePad np;
   JTextField tex;
   JLabel label;
   JButton find;
   JButton exit;
    public  FindDialog(NotePad owener)
     {
        super (owener, " 查找 " , false );
         this .np  =  owener;
        label    =   new  JLabel( "   查找内容 " );
        tex     =   new  JTextField( 5 );           
        find     =   new  JButton( " 查找下一个 " );
        exit     =   new  JButton( " 取消 " );
        Container contentPane  =  getContentPane();
        contentPane.setLayout( new  GridLayout( 2 , 2 ));
        contentPane.add(label);
        contentPane.add(tex);
        contentPane.add(find);
        contentPane.add(exit);
         this .setSize( 210 , 80 );
         this .setLocation( 450 , 350 );        
         this .setResizable( false );
       
        find.addActionListener( this );
        exit.addActionListener( this );
        tex.addKeyListener( new  MyKeyAdapter());
        find.setEnabled( false );        
         this .setVisible( true );
       
   }
    public   void  actionPerformed(ActionEvent e)
     {
       String str = np.text.getSelectedText();
        if (str == "" || str == null )
         {
           np.findIndex = 0 ;
       }
        if (e.getSource() == find)
         {           
           np.find(tex.getText(),np.findIndex);
       }
        else   if (e.getSource() == exit)
         {
            this .dispose();
       }
   }
    class  MyKeyAdapter  extends  KeyAdapter
     {       
        public   void  keyReleased(KeyEvent e)
         {
            if (np.text.getSelectedText() != "" )
             {
               find.setEnabled( true );
           }
       }
   }
}
// 查找替换对话框 /
class  ReplaceDialog  extends  JDialog  implements  ActionListener
 {
   NotePad np;
   JTextField ft;
   JTextField rt;
   JLabel b1;
   JLabel b2;
   JButton find;
   JButton rp;
   JButton rpa;
   JButton exit;
    public  ReplaceDialog(NotePad owener)
     {
        super (owener, " 替换 " , false );
         this .np  =  owener;
        b1  =   new  JLabel( " 查找内容 " );
        b2  =   new  JLabel( " 替  换  为  " );
        ft = new  JTextField( 8 );
         // 初始状态将已查找到的字符串放在此文本框中
         ft.setText(owener.text.getSelectedText());
        rt = new  JTextField( 8 );
                   
        find  =   new  JButton( " 查找下一个 " );
        rp    = new  JButton( " 替     换 " );
        rpa   = new  JButton( " 全部替换 " );
        exit     =   new  JButton( " 取       消 " );
        Container cp  =  getContentPane();
        JPanel p1 =   new  JPanel();
        JPanel p2 =   new  JPanel();
        JPanel p3 =   new  JPanel();
       
        p1.setLayout( new  GridLayout( 2 , 3 , 5 , 2 ));
        p1.add(b1);
        p1.add(ft);
        p1.add(find);
        p1.add(b2);
        p1.add(rt);
        p1.add(rp);        
        cp.add(p1,BorderLayout.NORTH);
       
        p2.setLayout( new  FlowLayout(FlowLayout.RIGHT));
        p2.add(rpa);
        p2.add(exit);
        cp.add(p2,BorderLayout.SOUTH);    
       
         this .setSize( 350 , 120 );
         this .setLocation( 400 , 350 );        
         this .setResizable( false );
       
        find.addActionListener( this );
        rp.addActionListener( this );
        rpa.addActionListener( this );
        exit.addActionListener( this );
       
        ft.addKeyListener( new  MyKeyAdapter());
        rt.addKeyListener( new  MyKeyAdapter());
        find.setEnabled( false );
        rp.setEnabled( false );
        rpa.setEnabled( false );
                
         this .setVisible( true );
   }
  
    public   void  actionPerformed(ActionEvent e)
     {       
        if (e.getSource() == find)
         {   
            /**/ /* String str=np.text.getSelectedText();
           if(str==""||str==null)
           {
               np.findIndex=0;
           } */
            if (ft.getText().equals(np.findStr) == false )
             {
               np.findIndex = 0 ;
           }    
           np.findStr = ft.getText();   
           np.find(np.findStr,np.findIndex);               
       }
        if (e.getSource() == rp)
         {
           String str = np.text.getSelectedText();
            if (str != "" && str != null )
             {
               np.text.replaceSelection(rt.getText());
           }            
       }
        if (e.getSource() == rpa)
         {
            int  n = np.text.getText().length();
           np.replaceAll(ft.getText(),rt.getText(), 0 ,n);
       }
        else   if (e.getSource() == exit)
         {
            this .dispose();
       }
   }
    class  MyKeyAdapter  extends  KeyAdapter
     { // 如果查找或替换框内没有内容则相应按钮不可用        
         public   void  keyReleased(KeyEvent e)
         {
            if (ft.getText() != "" )
             {
               find.setEnabled( true );
           }
            if (rt.getText() != "" )
             {
               rp.setEnabled( true );
               rpa.setEnabled( true );
           }
       }
   }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值