本身根據網上資料作的一個記事本,有些功能還不太完善。

這個記事本主要是在學習javaGUI及其基本知識後,參考網上資料作出。在製做過程當中,同時也發現了java中lastIndex()方法存在不能準確刪選數據的狀況,而後本身進行了修改。java

如下是代碼部分:數組

package com.Program;
import java.awt.*;
import java.awt.datatransfer.*;

import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.MenuEvent;
import javax.swing.event.MenuKeyEvent;
import javax.swing.event.MenuKeyListener;
import javax.swing.event.MenuListener;
import javax.swing.undo.*;

import java.awt.event.*;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
public class NoteBook extends JFrame implements ActionListener  {
    JMenuBar bar;//菜單欄
    JMenu menu1,  menu2,  menu3,  menu4,  menu5;//菜單
    JPopupMenu menu6;//右鍵彈出菜單
    JMenuItem menu10 ,menu11, menu12, menu13, menu14, menu15, menu16;//菜單一:子菜單
    JMenuItem menu20 ,menu21, menu22, menu23, menu24, menu25, menu26, menu27, menu28, menu29, menu291;//菜單二:子菜單
    JMenuItem menu31; JCheckBoxMenuItem menu30;//菜單三:子菜單
    JCheckBoxMenuItem menu40;//菜單四:子菜單
    JMenuItem menu50 ,menu51;//菜單五:子菜單
    JMenuItem menu60 ,menu61 ,menu62 ,menu63 ,menu64 ,menu65 ;//右鍵彈出菜單子菜單
    JTextArea textarea;//文本域
    JScrollPane scroll;//滾動條
    JLabel statusBar;//狀態欄標籤
    Font font1;//字體
    UndoManager undo;//撤銷
    Toolkit toolKit;//工具包
    Clipboard clipboard;//剪貼板
    JCheckBox checkCase;//查找下一個(F3)
    TextField searchContents = new TextField(15);//查找搜索框內內容
    TextField field1 = new TextField(15);//替換搜索框內容
    TextField field2 = new TextField(15);//替換內容
    public static void main(String[] args) {
        NoteBook nob = new NoteBook();
    }
    NoteBook(){

        font1 = new Font("微軟雅黑",Font.PLAIN,12);//設置字體
        //實現 Enumeration 接口的對象,它生成一系列元素,一次生成一個。連續調用 nextElement 方法將返回一系列的連續元素。
        //UIManager 管理當前外觀、可用外觀集合、外觀更改時被通知的 PropertyChangeListeners、外觀默認值以及獲取各類默認值的便捷方法。
        //getDefaults()返回包含該默認值的 UIDefaults 對象。使用類文檔中指定的邏輯解析返回的默認值,
        //Swing 組件的默認值表。應用程序能夠經過 UIManager 設置/獲取默認值
        //UIManager.put(Object key, Object value);在開發人員默認值中存儲一個對象。此方法是 getDefaults().put(key, value) 的一個覆蓋方法。
        //此方法僅對開發人員默認值有效,對系統默認值和外觀默認值無效。
        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, font1);  
            }  
        }
        undo = new UndoManager();//撤銷操做建立了一個 UndoManager

        toolKit = Toolkit.getDefaultToolkit(); //獲取默認工具包
        //建立剪貼板對象,獲取系統 Clipboard 的一個實例,該 Clipboard 可做爲本機平臺提供的剪貼板工具的接口
        clipboard = toolKit.getSystemClipboard();

        bar = new JMenuBar();//菜單欄

        //設置文件菜單及其子菜單
        menu1 = new JMenu("文件(F)");
        menu1.setMnemonic('F');//設置快捷鍵Alt+F

        menu10 = new JMenuItem("新建(N)");
        menu10.setMnemonic('N');
        menu10.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));//設置快捷鍵Ctrl+N
        menu10.addActionListener(this);//設置組件監聽

        menu11 = new JMenuItem("打開(O)");
        menu11.setMnemonic('O');
        menu11.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
        menu11.addActionListener(this);

        menu12 = new JMenuItem("保存(S)");
        menu12.setMnemonic('S');
        menu12.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
        menu12.addActionListener(this);

        menu13 = new JMenuItem("另存爲(A)");
        menu13.setMnemonic('A');
        menu13.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
        menu13.addActionListener(this);

        menu14 = new JMenuItem("頁面設置(U)");
        menu14.setMnemonic('U');
        menu14.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_U,InputEvent.CTRL_MASK));
        menu14.addActionListener(this);

        menu15 = new JMenuItem("打印(P)");
        menu15.setMnemonic('P');
        menu15.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P,InputEvent.CTRL_MASK));
        menu15.addActionListener(this);

        menu16 = new JMenuItem("退出(X)");
        menu16.setMnemonic('X');
        menu16.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
        menu16.addActionListener(this);

        //設置編輯菜單及其子菜單
        menu2 = new JMenu("編輯(E)");
        menu2.setMnemonic('E');

        menu20 = new JMenuItem("撤銷(U)");
        menu20.setMnemonic('U');
        menu20.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));
        menu20.addActionListener(this);

        menu21 = new JMenuItem("剪切(T)");
        menu21.setMnemonic('T');
        menu21.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_T,InputEvent.CTRL_MASK));
        menu21.addActionListener(this);

        menu22 = new JMenuItem("複製(C)");
        menu22.setMnemonic('C');
        menu22.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
        menu22.addActionListener(this);

        menu23 = new JMenuItem("粘貼(V)");
        menu23.setMnemonic('V');
        menu23.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
        menu23.addActionListener(this);

        menu24 = new JMenuItem("刪除(L)");
        menu24.setMnemonic('L');
        menu24.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
        menu24.addActionListener(this);

        menu25 = new JMenuItem("查找(F)");
        menu25.setMnemonic('F');
        menu25.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
        menu25.addActionListener(this);

        menu26 = new JMenuItem("查找下一個(N)");
        menu26.setMnemonic('N');
        menu26.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
        menu26.addActionListener(this);

        menu27 = new JMenuItem("替換(R)");
        menu27.setMnemonic('R');
        menu27.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H,InputEvent.CTRL_MASK));
        menu27.addActionListener(this);

        menu28 = new JMenuItem("轉到(G)");
        menu28.setMnemonic('G');
        menu28.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G,InputEvent.CTRL_MASK));
        menu28.addActionListener(this);

        menu29 = new JMenuItem("全選(A)");
        menu29.setMnemonic('A');
        menu29.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A,InputEvent.CTRL_MASK));
        menu29.addActionListener(this);

        menu291 = new JMenuItem("時間/日期(D)");
        menu291.setMnemonic('D');
        menu291.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
        menu291.addActionListener(this);

        //格式菜單及其子菜單
        menu3 = new JMenu("格式(O)");
        menu3.setMnemonic('O');

        menu30 = new JCheckBoxMenuItem("自動換行(W)");//能夠被選定或取消選定的菜單項
        menu30.setMnemonic('W');
        menu30.setState(true);//默認自動轉行爲選定狀態

        menu30.addActionListener(this);

        menu31 = new JMenuItem("字體(F)");
        menu31.setMnemonic('F');
        menu31.addActionListener(this);

        //查看菜單及子菜單    
        menu4 = new JMenu("查看(V)");
        menu4.setMnemonic('V');

        menu40 = new JCheckBoxMenuItem("狀態欄(S)");
        menu40.setMnemonic('S');
        menu40.addActionListener(this);

        //幫助菜單及子菜單
        menu5 = new JMenu("幫助(H)");
        menu5.setMnemonic('U');

        menu50 = new JMenuItem("查看幫助(H)");
        menu50.setMnemonic('H');
        menu50.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
        menu50.addActionListener(this);

        menu51 = new JMenuItem("關於記事本(A)");
        menu51.setMnemonic('A');
        menu51.addActionListener(this);

        //右鍵彈出菜單及子菜單
        menu6 = new JPopupMenu();
        menu60 = new JMenuItem("撤銷(U)");
        menu60.addActionListener(this);
        menu61 = new JMenuItem("剪切(X)");
        menu61.addActionListener(this);
        menu62 = new JMenuItem("複製(C)");
        menu62.addActionListener(this);
        menu63 = new JMenuItem("粘貼(V)");
        menu63.addActionListener(this);
        menu64 = new JMenuItem("刪除(L)");
        menu64.addActionListener(this);
        menu65 = new JMenuItem("全選(A)");
        menu65.addActionListener(this);


        //新建文本域和滾動條
        textarea = new JTextArea();
        textarea.setLineWrap(true);//自動轉行爲選定狀態時,使textarea自動轉行
        //將UndoManager 並將它做爲 UndoableEditListener 添加到 JTextArea
        textarea.getDocument().addUndoableEditListener(undo);
        scroll = new JScrollPane(textarea);
        
        //狀態欄標籤
        statusBar = new JLabel("狀態欄");
        statusBar.setVisible(false);

        //向菜單添加組件
        menu1.add(menu10);
        menu1.add(menu11);
        menu1.add(menu12);
        menu1.add(menu13);
        menu1.addSeparator();
        menu1.add(menu14);
        menu1.add(menu15);
        menu1.addSeparator();
        menu1.add(menu16);

        menu2.add(menu20);
        menu2.addSeparator();
        menu2.add(menu21);
        menu2.add(menu22);
        menu2.add(menu23);
        menu2.add(menu24);
        menu2.addSeparator();
        menu2.add(menu25);
        menu2.add(menu26);
        menu2.add(menu27);
        menu2.add(menu28);
        menu2.addSeparator();
        menu2.add(menu29);
        menu2.add(menu291);

        menu3.add(menu30);
        menu3.add(menu31);

        menu4.add(menu40);

        menu5.add(menu50);
        menu5.addSeparator();
        menu5.add(menu51);

        menu6.add(menu60);
        menu6.addSeparator();
        menu6.add(menu61);
        menu6.add(menu62);
        menu6.add(menu63);
        menu6.add(menu64);
        menu6.addSeparator();
        menu6.add(menu65);

        //向菜單欄添加菜單
        bar.add(menu1);
        bar.add(menu2);
        bar.add(menu3);
        bar.add(menu4);
        bar.add(menu5);

        /*//設置菜單字體
        menu1.setFont(font1);
        menu2.setFont(font1);
        menu3.setFont(font1);
        menu4.setFont(font1);
        menu5.setFont(font1);*/

        //向JFrame添加組件
        this.setJMenuBar(bar);
        this.add(scroll);
        this.add(statusBar,BorderLayout.SOUTH);

        //設置窗口
        ImageIcon img1 = new ImageIcon("image/note.png");
        this.setIconImage(img1.getImage());
        this.setTitle("記事本");
        this.setSize(600, 400);
        this.setLocation(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setVisible(true);

        //添加窗口監聽事件,new WindowAdapter()接收窗口事件的抽象適配器類,
        //其下方法public void windowClosing(WindowEvent e)
        this.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                windowExit();//調用窗口關閉時的方法
            }
        });

        //設置打開編輯菜單時調用功能可用性函數,實現各功能的可用性
        menu2.addMenuListener(new MenuListener(){//添加菜單事件的偵聽器

            @Override
            public void menuCanceled(MenuEvent e) {//取消菜單時調用

                functionAvailable();//調用編輯菜單功能可用性
            }

            @Override
            public void menuDeselected(MenuEvent e) {//取消選擇某個菜單時調用

                functionAvailable();
            }

            @Override
            public void menuSelected(MenuEvent e) {//選擇某個菜單時調用

                functionAvailable();
            }

        });


        //文本域點擊右鍵出現菜單事件
        //擴展此類可建立 MouseEvent(包括拖動和移動事件)或/和 MouseWheelEvent 偵聽器,並針對所需事件重寫方法
        textarea.addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent e){
                if(e.isPopupTrigger()){//返回此鼠標事件是否爲該平臺的彈出菜單觸發事件
                    //e.getComponent()返回事件的始發者,e.get()返回事件相對於源組件的水平 x ,y座標。
                    //在組件調用者的座標空間中的位置 X、Y 顯示彈出菜單。
                    menu6.show(e.getComponent(),e.getX(), e.getY());    
                }
                functionAvailable();

            }
            public void mouseReleased(MouseEvent e){
                if(e.isPopupTrigger()){//返回此鼠標事件是否爲該平臺的彈出菜單觸發事件
                    //e.getComponent()返回事件的始發者,e.get()返回事件相對於源組件的水平 x ,y座標。
                    //在組件調用者的座標空間中的位置 X、Y 顯示彈出菜單。
                    menu6.show(e.getComponent(),e.getX(), e.getY());
                }
                functionAvailable();
            }
        });
    }
    /*protected void processWindowEvent(WindowEvent e) {  
        if (e.getID() == WindowEvent.WINDOW_CLOSING)  
            System.out.println("ss");; //直接返回,阻止默認動做,阻止窗口關閉   
    }*/
    //LastIndexOf方法替換
    public int change(String strA,String strB,int index){
        int k = -1;
        char[] chA = strA.toCharArray();
        for (int i = 0; i < chA.length/2; i++) {
            char mg = chA[i];
            chA[i] = chA[chA.length-1-i];
            chA[chA.length-1-i] = mg;
        }
        char[] chB = strB.toCharArray();
        for (int i = 0; i < chB.length/2; i++) {
            char mg = chB[i];
            chB[i] = chB[chB.length-1-i];
            chB[chB.length-1-i] = mg;
        }
        String strC = new String(chA);
        String strD = new String(chB);

        if(strC.indexOf(strD,strA.length()-1-index) != -1){
            k = strA.length()-(strC.indexOf(strD,strA.length()-1-index)+strB.length());
        }
        return k;    
    }
    //設置各功能可用性
    public void functionAvailable(){
        if(textarea.getText().equals("")){//文本爲空時查找一系列功能不可用
            menu25.setEnabled(false);
            menu26.setEnabled(false);
        }else{
            menu25.setEnabled(true);
            menu26.setEnabled(true);
        }
        if(textarea.getSelectedText() == null){//文本域選擇內容爲空時設置可用性
            menu21.setEnabled(false);
            menu22.setEnabled(false);
            menu24.setEnabled(false);
            menu61.setEnabled(false);
            menu62.setEnabled(false);
            menu64.setEnabled(false);
        }else{
            menu21.setEnabled(true);
            menu22.setEnabled(true);
            menu24.setEnabled(true);
            menu61.setEnabled(true);
            menu62.setEnabled(true);
            menu64.setEnabled(true);
        }
        if(clipboard.getContents(this) == null){//剪貼板可用性
            menu23.setEnabled(false);
            menu63.setEnabled(false);
        }else{
            menu23.setEnabled(true);
            menu63.setEnabled(true);
        }
    }
    public void windowExit(){//窗口關閉時的方法
        String textAll = textarea.getText();
        if(!textAll.equals("")){//文本域不爲空
            int choice = JOptionPane.showConfirmDialog(null, "你的文件還沒有保存,是否保存?", "記事本",JOptionPane.YES_NO_CANCEL_OPTION );
            if(choice == JOptionPane.NO_OPTION){//不保存,直接退出
                System.exit(0);
            }else if(choice == JOptionPane.CANCEL_OPTION){//取消不作任何操做
                this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
            }else if(choice == JOptionPane.YES_OPTION){//保存文件,調用保存功能
                JFileChooser jfl = new JFileChooser();//彈出一個針對用戶主目錄的文件選擇器,
                jfl.setDialogTitle("保存");
                jfl.showSaveDialog(null);
                jfl.setVisible(true);    
                try{
                    String filePath = jfl.getSelectedFile().getAbsolutePath();//獲取選擇文件的絕對路徑
                    PrintStream prins = new PrintStream(filePath);//建立具備指定文件且不帶自動行刷新的新打印流
                    System.setOut(prins);//從新分配「標準」輸出流public static void setOut(PrintStream out)
                    System.out.println(this.textarea.getText());//
                }catch(Exception exception){

                }
            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {//組件事件功能實現
        if(e.getSource()==menu10){//文件菜單新建功能
            String textAll = textarea.getText();
            if(!textAll.equals("")){//文本域不爲空
                int choice = JOptionPane.showConfirmDialog(null, "你的文件還沒有保存,是否保存?", "記事本",JOptionPane.YES_NO_CANCEL_OPTION );
                if(choice == JOptionPane.NO_OPTION){//不保存,文本域內容置爲空
                    textarea.setText(null);
                }else if(choice == JOptionPane.CANCEL_OPTION){//取消不作任何操做

                }else if(choice == JOptionPane.YES_OPTION){//保存文件,調用保存功能
                    JFileChooser jfl = new JFileChooser();//彈出一個針對用戶主目錄的文件選擇器,
                    jfl.setDialogTitle("保存");
                    jfl.showSaveDialog(null);
                    jfl.setVisible(true);    
                    try{
                        String filePath = jfl.getSelectedFile().getAbsolutePath();//獲取選擇文件的絕對路徑
                        PrintStream prins = new PrintStream(filePath);//建立具備指定文件且不帶自動行刷新的新打印流
                        System.setOut(prins);//從新分配「標準」輸出流public static void setOut(PrintStream out)
                        System.out.println(this.textarea.getText());//
                    }catch(Exception exception){

                    }
                }
            }
        }else if(e.getSource()==menu11){//文件菜單打開功能
            JFileChooser jfl = new JFileChooser();
            jfl.setDialogTitle("打開文件");
            jfl.showOpenDialog(null);
            jfl.setVisible(true);        
            FileReader fileFlow = null;
            BufferedReader bufferedStream = null;
            try{
                String filePath = jfl.getSelectedFile().getAbsolutePath();
                fileFlow = new FileReader(filePath);//在給定從中讀取數據的 File 的狀況下建立一個新 FileReader
                bufferedStream =new BufferedReader(fileFlow);//建立一個使用默認大小輸入緩衝區的緩衝字符輸入流
                String rolText = "",allText = "";
                while((rolText = bufferedStream.readLine()) != null){//當不爲空時,一行一行的讀取文件中的字符
                    allText += rolText+"\n";
                }
                textarea.setText(allText);
            }catch(Exception exception){

            }finally{
                try{//關閉流
                    fileFlow.close();
                    bufferedStream.close();
                }catch(Exception exception){

                }
            }        
        }else if(e.getSource() == menu12){//文件菜單保存功能
            JFileChooser jfl = new JFileChooser();
            jfl.setDialogTitle("保存");
            jfl.showSaveDialog(null);
            jfl.setVisible(true);    
            try{
                String filePath = jfl.getSelectedFile().getAbsolutePath();
                PrintStream prins = new PrintStream(filePath);
                System.setOut(prins);
                System.out.println(this.textarea.getText());
            }catch(Exception exception){

            }
        }else if(e.getSource() == menu13){//文件菜單另存爲功能
            JFileChooser jfl = new JFileChooser();
            jfl.setDialogTitle("另存爲");
            jfl.showSaveDialog(null);
            jfl.setVisible(true);    
            try{
                String filePath = jfl.getSelectedFile().getAbsolutePath();
                PrintStream prins = new PrintStream(filePath);
                System.setOut(prins);
                System.out.println(this.textarea.getText());
            }catch(Exception exception){

            }
        }else if(e.getSource() == menu14){//文件菜單頁面設置功能
            JOptionPane.showMessageDialog(null,"吾學識有限,尚不能實現該功能,還望見諒!","頁面設置",JOptionPane.INFORMATION_MESSAGE);
        }else if(e.getSource() == menu15){//文件菜單打印功能
            JOptionPane.showMessageDialog(null,"吾學識有限,仍不能實現該功能,吾將繼續學習!","打印",JOptionPane.INFORMATION_MESSAGE);
        }else if(e.getSource() == menu16){//文件菜單退出功能
            String textAll = textarea.getText();
            if(!textAll.equals("")){//文本域不爲空
                int choice = JOptionPane.showConfirmDialog(null, "你的文件還沒有保存,是否保存?", "記事本",JOptionPane.YES_NO_CANCEL_OPTION );
                if(choice == JOptionPane.NO_OPTION){//不保存,文本域內容置爲空
                    System.exit(0);
                }else if(choice == JOptionPane.CANCEL_OPTION){//取消不作任何操做

                }else if(choice == JOptionPane.YES_OPTION){//保存文件,調用保存功能
                    JFileChooser jfl = new JFileChooser();
                    jfl.setDialogTitle("保存");
                    jfl.showSaveDialog(null);
                    jfl.setVisible(true);    
                    try{
                        String filePath = jfl.getSelectedFile().getAbsolutePath();
                        PrintStream prins = new PrintStream(filePath);
                        System.setOut(prins);
                        System.out.println(this.textarea.getText());
                    }catch(Exception exception){

                    }
                }
            }else{
                System.exit(0);
            }
        }else if(e.getSource() == menu20 || e.getSource() == menu60){//撤銷功能的實現
            if(undo.canUndo()){
                try{
                    undo.undo();
                }catch(Exception exception){

                }
            }else if(!undo.canUndo()){

            }
        }else if(e.getSource() == menu21 || e.getSource() == menu61){//剪切功能的實現
            String textSlected = textarea.getSelectedText();//獲取選擇的文本
            StringSelection selection = new StringSelection(textSlected);//建立能傳輸指定 String 的 Transferable
            //將剪貼板的當前內容設置到指定的 transferable 對象,並將指定的剪貼板全部者做爲新內容的全部者註冊。
            clipboard.setContents(selection, null);
            if(textSlected != null && textSlected.length() != 0){//textSlected爲空時,textSlected.length報錯
                //用指定替換文本替換指定開始位置與結束位置之間的文本
                textarea.replaceRange("", textarea.getSelectionStart(),textarea.getSelectionEnd());
            }else{
                return;
            }
        }else if(e.getSource() == menu22 || e.getSource() == menu62){//複製功能的實現
            String textSlected = textarea.getSelectedText();//獲取選擇的文本
            StringSelection selection = new StringSelection(textSlected);
            clipboard.setContents(selection, null);
        }else if(e.getSource() == menu23 || e.getSource() == menu63){//粘貼功能的實現
            Transferable selection = clipboard.getContents(this);//獲取剪貼板當前內容的 transferable 對象
            String change = null;
            try{
                //DataFlavor 表示 Java Unicode String 類,getTransferData返回一個對象,該對象表示將要被傳輸的數據
                change = (String)selection.getTransferData(DataFlavor.stringFlavor);
            }catch(Exception e1){

            }
            if(change != null){
                //若是剪貼板內容不爲空,則替換所選字符串
                textarea.replaceRange(change, textarea.getSelectionStart(),textarea.getSelectionEnd());
            }else{
                return;
            }
        }else if(e.getSource() == menu24 || e.getSource() == menu64){//刪除功能的實現
            //將所選字符串用""代替
            textarea.replaceRange("", textarea.getSelectionStart(),textarea.getSelectionEnd());
        }else if(e.getSource() == menu25){//查找功能的實現

            final JDialog dialog = new JDialog(this,"查找",false);
            //dialog.setLayout(new FlowLayout())不存在FlowLayout.LEFT功能,故須要生成一個Container
            Container content=dialog.getContentPane();//返回此對話框的contentPane對象  ,Container contentPane
            content.setLayout(new FlowLayout(FlowLayout.LEFT)); //設置左對齊

            JLabel search = new JLabel("查找內容(N):");
            final JButton searchNext = new JButton("查找下一個(F)");

            checkCase = new JCheckBox("區分大小寫(C)");    
            //ButtonGroup把單選按鈕放進一個組裏,默認功能是組裏按鈕只能選一個
            ButtonGroup btg = new ButtonGroup();
            final JRadioButton upButton = new JRadioButton("向上(U)");
            final JRadioButton downButton = new JRadioButton("向下(D)");
            upButton.setSelected(true);
            btg.add(downButton);
            btg.add(upButton);
            //建立一個放置向上向下按鈕的JPanel面板
            JPanel dirPanel = new JPanel();
            //設置dirPanel的邊框,BorderFactory邊框工廠,createTitledBorder("方向")爲建立一個空標題的新標題邊框,
            //使其具備指定的邊框對象、默認的文本位置(位於頂線上)、默認的調整 (leading),以及默認的字體和文本顏色(由當前外觀肯定)。
            dirPanel.setBorder(BorderFactory.createTitledBorder("方向"));
            dirPanel.add(upButton);
            dirPanel.add(downButton);

            JButton cancel = new JButton("取消");

            JPanel panel1 = new JPanel();
            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel();

            panel3.add(searchNext);
            panel3.add(cancel);
            panel3.setLayout(new GridLayout(2,1,0,10));

            panel1.add(search);
            panel1.add(searchContents);
            panel1.add(panel3);

            panel2.add(checkCase);
            panel2.add(dirPanel);



            dialog.add(panel1);
            dialog.add(panel2);

            dialog.setBounds(500, 500, 450,180);
            dialog.setResizable(false);
            dialog.setVisible(true);
            //組件監聽
            //取消按鈕操做
            cancel.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    //釋放由此 Window、其子組件及其擁有的全部子組件所使用的全部本機屏幕資源;而且dialog須要定義爲final
                    dialog.dispose();    
                }
            });
            //搜索框默認爲空時設置searchNext不可用
            if(searchContents.getText().equals("")){
                searchNext.setEnabled(false);
            }
            //監聽searchContents內容變化時,若是沒有內容searchNext爲不可用,不然可用
            searchContents.addTextListener(new TextListener(){
                @Override
                public void textValueChanged(TextEvent arg0) {
                    if(!searchContents.getText().equals("")){
                        searchNext.setEnabled(true);
                    }else{
                        searchNext.setEnabled(false);
                    }
                }
            });

            //監聽查找下一個按鈕
            searchNext.addActionListener(new ActionListener(){
                private int messageType;

                @Override
                public void actionPerformed(ActionEvent e) {
                    int k = 0;
                    String str1 , str2 , str3 , str4 ;
                    str1 = textarea.getText();
                    str2 = searchContents.getText();
                    if(checkCase.isSelected()){//若是勾選了區分大小寫按鈕,則不作任何轉換
                        str3 = str1;
                        str4 = str2;
                    }else{//若是不區分大小寫,則將其統一轉換爲大寫或者小寫
                        str3 = str1.toUpperCase();
                        str4 = str2.toUpperCase();
                    }
                    if(upButton.isSelected()){

                        if(textarea.getSelectedText() == null){//從光標位置開始查找
                            //System.out.println(textarea.getCaretPosition());
                            //textarea.getCaretPosition()獲取光標末尾或者選中文本末尾的對應值,
                            //該值從0到字符個數之間變化,全部字符前爲0,光標向後移動一個字符依次向後加一
                            //k是查找內容的索引值,光標位於其以前時,其值與此時的CaretPosition值同樣
                            //但lastIndexOf有bug查找時只要光標索引值>=包含所查找字符串的第一個字符的索引值就會默認查找
                            k =change(str3,str4,textarea.getCaretPosition()-1);

                            //k = str3.lastIndexOf(str4,textarea.getCaretPosition()-1);

                            //System.out.println(textarea.getCaretPosition());
                            //System.out.println(k);
                        }else{//從選中文本開始查找, textarea.getSelectedText().length()爲選中文本長度
                            k =change(str3,str4, textarea.getCaretPosition()- textarea.getSelectedText().length()-1);
                            //k = str3.lastIndexOf(str4, textarea.getCaretPosition()- searchContents.getText().length()-1 );
                            //System.out.println(k);
                            System.out.println(textarea.getCaretPosition());
                            System.out.println(searchContents.getText().length());
                            System.out.println(textarea.getCaretPosition()- searchContents.getText().length()-1);
                        }
                        if(k != -1){
                            textarea.setCaretPosition(k);//
                            textarea.select(k, k+searchContents.getText().length());
                        }else{
                            //定義str5 爲「找不到(查找內容)」的顯示
                            String str5 = "找不到\""+searchContents.getText()+"\"";
                            //設置彈出框
                            JOptionPane.showMessageDialog(null, str5,"記事本",JOptionPane.WARNING_MESSAGE);
                        }    
                    }else if(downButton.isSelected()){
                        //向下尋找時無論是光標(getCaretPosition()值爲光標右邊字符的位數)
                        //仍是選中字符串(getCaretPosition()值爲選中字符串最後一位字符的位數)
                        //其開始尋找位置的索引值爲(getCaretPosition()值+1)的字符的索引即值-1,即getCaretPosition()
                        k = str3.indexOf(str4,textarea.getCaretPosition());
                        /*if(textarea.getSelectedText() == null){
                            k = str3.indexOf(str4,textarea.getCaretPosition());
                            System.out.println(textarea.getCaretPosition());
                        }else{
                            k = str3.indexOf(str4, textarea.getCaretPosition());
                            System.out.println(textarea.getCaretPosition());
                        }*/
                        if(k != -1){
                            textarea.setCaretPosition(k);//
                            textarea.select(k, k+searchContents.getText().length());
                        }else{
                            String str5 = "找不到\""+searchContents.getText()+"\"";
                            JOptionPane.showMessageDialog(null, str5,"記事本",JOptionPane.WARNING_MESSAGE);
                        }
                    }
                }        
            });
        }else if(e.getSource() == menu26){
            if(!searchContents.getText().equals("")){
                int k = 0;
                String str1 , str2 , str3 , str4 ;
                str1 = textarea.getText();
                str2 = searchContents.getText();
                if(checkCase.isSelected()){//若是勾選了區分大小寫按鈕,則不作任何轉換
                    str3 = str1;
                    str4 = str2;
                }else{//若是不區分大小寫,則將其統一轉換爲大寫或者小寫
                    str3 = str1.toUpperCase();
                    str4 = str2.toUpperCase();
                }
                k = str3.indexOf(str4,textarea.getCaretPosition());
                if(k != -1){
                    textarea.setCaretPosition(k);//
                    textarea.select(k, k+searchContents.getText().length());
                }else{
                    String str5 = "找不到\""+searchContents.getText()+"\"";
                    JOptionPane.showMessageDialog(null, str5,"記事本",JOptionPane.WARNING_MESSAGE);
                }
            }    
        }else if(e.getSource() == menu27){
            System.out.println("3");
            //建立查找對話框
            final JDialog dialog = new JDialog(this,"查找",false);
            JLabel searchContent = new JLabel("查找內容(N)");
            JLabel  replace = new JLabel("替換爲(P)");
            final JButton buttonSearch = new JButton("查找下一個(F)");
            final JButton buttonReplace = new JButton("替換(R)");
            final JButton buttonAll = new JButton("所有替換(A)");
            JButton buttonCancel = new JButton("取消");
            final JCheckBox checkCase = new JCheckBox("區分大小寫(C)");

            JPanel panel1 = new JPanel();
            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel();
            JPanel panel4 = new JPanel();

            panel1.setLayout(new GridLayout(2,1,0,30));
            panel1.add(searchContent);
            panel1.add(replace);

            panel2.setLayout(new GridLayout(2,1,0,30));
            panel2.add(field1);
            panel2.add(field2);

            panel3.setLayout(new GridLayout(4,1,0,8));
            panel3.add(buttonSearch);
            panel3.add(buttonReplace);
            panel3.add(buttonAll);
            panel3.add(buttonCancel);

            //panel4.setLayout(new GridLayout(1,3));
            panel4.add(panel1,BorderLayout.WEST);
            panel4.add(panel2,BorderLayout.CENTER);
            panel4.add(panel3,BorderLayout.EAST);

            dialog.setLayout(new BorderLayout());
            dialog.add(panel4,BorderLayout.CENTER);
            dialog.add(checkCase,BorderLayout.SOUTH);
            dialog.setBounds(500, 500, 400,190);
            dialog.setResizable(false);
            dialog.setVisible(true);
            //組件監聽
            //取消按鈕操做
            buttonCancel.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    //釋放由此 Window、其子組件及其擁有的全部子組件所使用的全部本機屏幕資源;而且dialog須要定義爲final
                    dialog.dispose();    
                }
            });
            //搜索框默認爲空時設置searchNext不可用
            if(field1.getText().equals("")){
                buttonSearch.setEnabled(false);
                buttonReplace.setEnabled(false);
                buttonAll.setEnabled(false);
            }
            //監聽field1內容變化時,若是沒有內容buttonSearch、buttonReplace、buttonAll爲不可用,不然可用
            field1.addTextListener(new TextListener(){
                @Override
                public void textValueChanged(TextEvent arg0) {
                    if(!field1.getText().equals("")){
                        buttonSearch.setEnabled(true);
                        buttonReplace.setEnabled(true);
                        buttonAll.setEnabled(true);
                    }else{
                        buttonSearch.setEnabled(false);
                        buttonReplace.setEnabled(false);
                        buttonAll.setEnabled(false);
                    }
                }
            });
            //監聽查找下一個按鈕
            buttonSearch.addActionListener(new ActionListener(){
                private int messageType;

                @Override
                public void actionPerformed(ActionEvent e) {
                    int k = 0;
                    String str1 , str2 , str3 , str4 ;
                    str1 = textarea.getText();
                    str2 = field1.getText();
                    if(checkCase.isSelected()){//若是勾選了區分大小寫按鈕,則不作任何轉換
                        str3 = str1;
                        str4 = str2;
                    }else{//若是不區分大小寫,則將其統一轉換爲大寫或者小寫
                        str3 = str1.toUpperCase();
                        str4 = str2.toUpperCase();
                    }
                    k = str3.indexOf(str4,textarea.getCaretPosition());
                    if(k != -1){
                        textarea.setCaretPosition(k);//
                        textarea.select(k, k+field1.getText().length());
                    }else{
                        String str5 = "找不到\""+field1.getText()+"\"";
                        JOptionPane.showMessageDialog(null, str5,"記事本",JOptionPane.WARNING_MESSAGE);
                    }
                }        
            });
            //替換按鈕監聽事件
            buttonReplace.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    int k = 0;
                    String str1 , str2 , str3 , str4 ,str5 ,str6 ,str7 ,str8;
                    str1 = textarea.getText();
                    str2 = field1.getText();
                    str3 = textarea.getSelectedText();//沒有選擇爲空
                    str4 = field2.getText();

                    if(checkCase.isSelected()){//若是勾選了區分大小寫按鈕,則不作任何轉換
                        str5 = str1;
                        str6 = str2;
                        if(str3 == null){//str3空處理
                            str7 = "";
                        }else{
                            str7 = str3;
                        }
                        str8 = str4;
                    }else{//若是不區分大小寫,則將其統一轉換爲大寫或者小寫
                        str5 = str1.toUpperCase();
                        str6 = str2.toUpperCase();
                        if(str3 == null){
                            str7 = "";
                        }else{
                            str7 = str3.toUpperCase();
                        }
                        str8 = str4.toUpperCase();    
                    }
                    if(!str7.equals("") && str7.equals(str6) ){
                        textarea.replaceSelection(field2.getText());
                    }
                    k = str5.indexOf(str6,textarea.getCaretPosition());
                    if(k != -1){
                        textarea.setCaretPosition(k);//
                        textarea.select(k, k+field1.getText().length());
                    }else{
                        String str9 = "找不到\""+field1.getText()+"\"";
                        JOptionPane.showMessageDialog(null, str9,"記事本",JOptionPane.WARNING_MESSAGE);
                    }
                }});
            //所有替換按鈕監聽事件
            buttonAll.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    int k = 0;
                    while(k != -1){
                        String str1 , str2 , str3 , str4 ,str5 ,str6 ;
                        str1 = textarea.getText();
                        str2 = field1.getText();
                        str3 = field2.getText();
                        if(checkCase.isSelected()){//若是勾選了區分大小寫按鈕,則不作任何轉換
                            str4 = str1;
                            str5 = str2;
                            str6 = str3;
                        }else{//若是不區分大小寫,則將其統一轉換爲大寫或者小寫
                            str4 = str1.toUpperCase();
                            str5 = str2.toUpperCase();
                            str6 = str3.toUpperCase();    
                        }
                        textarea.setCaretPosition(0);//將光標放置文本開頭
                        //注意循環時str4,str5值未改變,但實際應該改變,因此str4,str5應該放在循環內
                        k = str4.indexOf(str5,textarea.getCaretPosition());
                        if(k != (-1)){
                            textarea.setCaretPosition(k);
                            //textarea.select(k, k+field1.getText().length());
                            //textarea.replaceSelection(field2.getText());
                            textarea.replaceRange(field2.getText(), k, k+field1.getText().length());
                        }
                    }
                }    
            });
        }else if(e.getSource() == menu28){//設置轉到事件
            JOptionPane.showMessageDialog(null,"該功能還沒有實現,同志仍需努力","轉到",JOptionPane.INFORMATION_MESSAGE);
        }else if(e.getSource() == menu29 || e.getSource() == menu65){//設置全選
            textarea.selectAll();
        }else if(e.getSource() == menu291){//設置日期事件
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//設置日期格式
            textarea.insert(df.format(new Date()), textarea.getText().length());// new Date()爲獲取當前系統時間
        }else if(e.getSource() == menu30){//設置自動轉行事件
            if(menu30.getState()){
                textarea.setLineWrap(true);
            }else{
                textarea.setLineWrap(false);
            }    
        }else if(e.getSource() == menu31){//設置字體
            final JDialog fontdialog = new JDialog(this,"字體",true);

            JPanel panel1 = new JPanel();
            JPanel panel2 = new JPanel();
            JPanel panel3 = new JPanel();
            JPanel panel4 = new JPanel();
            JPanel panel5 = new JPanel();
            JPanel panel6 = new JPanel();


            JLabel fontStyle = new JLabel("字體(F):");
            //設置此組件的首選大小,Dimension 類封裝單個對象中組件的寬度和高度(精確到整數)
            //fontStyle.setPreferredSize(new Dimension(100,20));
            //fontStyle.setSize(100, 20);
            final JTextField textStyle = new JTextField(11);
            //textStyle.setPreferredSize(new Dimension(50,20));
            //GraphicsEnvironment 類描述了 Java(tm) 應用程序在特定平臺上可用的 GraphicsDevice 對象和 Font 對象的集合。
            //getLocalGraphicsEnvironment()返回本地 GraphicsEnvironment。
            GraphicsEnvironment gre = GraphicsEnvironment.getLocalGraphicsEnvironment();
            //返回一個包含此 GraphicsEnvironment 中全部字體系列名稱的數組,它針對默認語言環境進行了本地化,由 Locale.getDefault() 返回。
            String[] stl = gre.getAvailableFontFamilyNames();
            final JList styleList = new JList(stl);
            styleList.setFixedCellHeight(20);//設置一個固定值,將用於列表中每一個單元的高度。
            styleList.setFixedCellWidth(108);//設置一個固定值,將用於列表中每一個單元的寬度。
            JScrollPane scroStyle = new JScrollPane(styleList);

            JLabel fontsBold = new JLabel("字形(Y):");
            final JTextField textBold = new JTextField(8);
            String[] bol = {"常規","傾斜","粗體","粗體  傾斜"};
            final JList boldList = new JList(bol);
            boldList.setFixedCellHeight(20);//設置一個固定值,將用於列表中每一個單元的高度。
            boldList.setFixedCellWidth(76);//設置一個固定值,將用於列表中每一個單元的寬度。
            JScrollPane scroBold = new JScrollPane(boldList);
            //設置滾動條一直可見
            scroBold.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );


            JLabel fontSize = new JLabel("大小(S):");
            final JTextField textSize = new JTextField(5);
            String[] sil = {"8","9","10","11","12","14","16","18","20","22","24","26","28","36","48","72"};
            //"初號","小初","一號","小一","二號","小二","三號","小三","四號","小四","五號","小五","六號","小六","七號","八號"現不能對應整數磅值
            final JList sizeList = new JList(sil);
            sizeList.setFixedCellHeight(20);//設置一個固定值,將用於列表中每一個單元的高度。
            sizeList.setFixedCellWidth(40);//設置一個固定值,將用於列表中每一個單元的寬度。
            JScrollPane scroSize = new JScrollPane(sizeList);


            final JLabel example = new JLabel("你看!");
            JButton affirmButton = new JButton("確認");
            JButton cancelButton = new JButton("取消");

            //panel1.setLayout(new BorderLayout());
            panel1.add(fontStyle);
            panel1.add(textStyle);
            panel1.add(scroStyle);
            panel1.setPreferredSize(new Dimension(140,250));

            //panel2.setLayout(new BorderLayout());
            panel2.add(fontsBold);  
            panel2.add(textBold);
            panel2.add(scroBold);
            panel2.setPreferredSize(new Dimension(110,250));

            //panel3.setLayout(new BorderLayout());
            panel3.add(fontSize);
            panel3.add(textSize);
            panel3.add(scroSize);
            panel3.setPreferredSize(new Dimension(80,250));

            panel4.setLayout(new FlowLayout());
            panel4.add(panel1); panel4.add(panel2); panel4.add(panel3);

            panel5.add(example);
            panel5.setBorder(BorderFactory.createTitledBorder("示例"));
            panel5.setPreferredSize(new Dimension(250,120));

            //panel6.setLayout(new GridLayout(1,2));
            panel6.add(affirmButton); panel6.add(cancelButton);
            panel6.setPreferredSize(new Dimension(250,50));

            fontdialog.setLayout(new FlowLayout());
            fontdialog.add(panel4); fontdialog.add(panel5); fontdialog.add(panel6);

            //取消按鈕事件        
            cancelButton.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    fontdialog.dispose();
                }
            });
            Font currentFont = textarea.getFont();
            textStyle.setText(currentFont.getFontName());
            textStyle.selectAll();
            String str = String.valueOf(currentFont.getStyle());//返回 int 參數的字符串表示形式。
            textBold.setText(str);
            textBold.selectAll();
            String str1 = String.valueOf(currentFont.getSize());
            textSize.setText(str1);
            //設置textStyle對應的字體表示
            if(currentFont.getStyle()==Font.PLAIN){
                textBold.setText("常規");  
            }else if(currentFont.getStyle()==Font.BOLD){
                textBold.setText("粗體");  
            }else if(currentFont.getStyle()==Font.ITALIC){  
                textBold.setText("斜體");
            }else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC)){
                textBold.setText("粗斜體");  
            }
            //根據文本域字體初始值設置boldList選中下標索引值,否則當boldList未選中時。其下標值爲-1;
            if(currentFont.getStyle()==Font.PLAIN){
                boldList.setSelectedIndex(0);
            }else if(currentFont.getStyle()==Font.BOLD){
                boldList.setSelectedIndex(1);  
            }else if(currentFont.getStyle()==Font.ITALIC){  
                boldList.setSelectedIndex(2);
            }else if(currentFont.getStyle()==(Font.BOLD+Font.ITALIC)){
                boldList.setSelectedIndex(3);
            }
            //定義一個數組,其下標值對應字體格式style
            final int style[] = {Font.PLAIN,Font.BOLD,Font.ITALIC,Font.BOLD+Font.ITALIC};
            styleList.addListSelectionListener(new ListSelectionListener(){//字體名稱列表事件
                @Override

                public void valueChanged(ListSelectionEvent e) {
                    // getSelectedValue()返回最小的選擇單元索引的值;只選擇了列表中單個項時,返回所選值
                    textStyle.setText((String) styleList.getSelectedValue());
                    //textStyle.selectAll();
                    //根據指定名稱、樣式和磅值大小,建立一個新 Font。
                    System.out.println();
                    example.setFont(new Font(textStyle.getText(),style[boldList.getSelectedIndex()],Integer.parseInt(textSize.getText())));
                }
            });

            boldList.addListSelectionListener(new ListSelectionListener(){//字體格式列表事件
                @Override

                public void valueChanged(ListSelectionEvent e) {
                    // getSelectedValue()返回最小的選擇單元索引的值;只選擇了列表中單個項時,返回所選值
                    textBold.setText((String) boldList.getSelectedValue());
                    //textStyle.selectAll();
                    example.setFont(new Font(textStyle.getText(),style[boldList.getSelectedIndex()],Integer.parseInt(textSize.getText())));
                }
            });

            sizeList.addListSelectionListener(new ListSelectionListener(){//字體尺寸列表事件
                @Override

                public void valueChanged(ListSelectionEvent e) {
                    // getSelectedValue()返回最小的選擇單元索引的值;只選擇了列表中單個項時,返回所選值
                    textSize.setText((String) sizeList.getSelectedValue());
                    //textStyle.selectAll();
                    example.setFont(new Font(textStyle.getText(),style[boldList.getSelectedIndex()],Integer.parseInt(textSize.getText())));
                }
            });

            affirmButton.addActionListener(new ActionListener(){//肯定按鈕
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    textarea.setFont(example.getFont());
                    fontdialog.dispose();
                }
            });
            fontdialog.setSize(380, 460);
            fontdialog.setLocation(500,500);
            fontdialog.setResizable(false);
            fontdialog.setVisible(true);
        }else if(e.getSource() == menu40){
            if(menu40.getState()){
                statusBar.setVisible(true);
            }else{
                statusBar.setVisible(false);
            }
            //JOptionPane.showMessageDialog(null, "很是遺憾,該功能我不會O(∩_∩)O","狀態欄",JOptionPane.WARNING_MESSAGE);
        }else if(e.getSource() == menu50){
            JOptionPane.showMessageDialog(null, "很是抱歉,沒人能夠幫助你,放棄吧","幫助",JOptionPane.WARNING_MESSAGE);
        }else if(e.getSource() == menu51){
            JOptionPane.showMessageDialog(null, "秋山寒葉似飄零,南國歸雁北國情&春風繾綣月西樓,獨倚空樓寄閒愁。"+"\n"
                    +"誰家東窗難掩愁,隨風飄到聲盡頭。&空山久待降飛霜,朔夜孤寒裹銀裝。"+"\n"
                    +"&久聞此山慕名臨,長嘆他鄉唏噓離。&空城敗旗倒金戈,萬家燈火向誰國。"+"\n"
                    +"&浮生偷得半日閒,細溫紅樓把酒沾。&暗夜香襲牀前枕,古曲悠悠落雨聲。",
                    "狀態欄",JOptionPane.INFORMATION_MESSAGE);
        }
    }
}

ide

相關文章
相關標籤/搜索