与Java相伴的日子
相识,相知,相恋,到相守......我的日子因你的到来而充实,我的日子因你的存在而多姿!
posts - 4,comments - 22,trackbacks - 0

       以下是我用Swing 组件编写的记事本,功能是模仿微软的,使用了观感,自我觉得界面比Win的记事本更为好看(臭屁一下吧)。除了没有做字体选择之外,其他功能基本都有了吧。

/**
 *Author:
Zhang Zhijian 
 *Mail: qnjian@163.com
 *Created  on 2005-5-22
 * 声明:本程序版权归作者所有,允许以学习目的的传播,
 * 但必须保留本作者署名及源程序的完整!
 
*/


package  com.qnjian.notpad;

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);