简单记事本

来源:互联网 发布:本港台直播软件 编辑:程序博客网 时间:2024/05/27 09:48
import java.awt.*;
import java.awt.event.*;
import java.awt.print.PrinterException;
import java.text.*;
import java.util.*;
import java.io.*;

import javax.swing.undo.*;
import javax.swing.*;
import javax.swing.event.*;

import java.awt.datatransfer.*;
import java.awt.dnd.DnDConstants;
import java.awt.dnd.DropTarget;
import java.awt.dnd.DropTargetDragEvent;
import java.awt.dnd.DropTargetDropEvent;
import java.awt.dnd.DropTargetEvent;
import java.awt.dnd.DropTargetListener;
import java.util.List;

public class Notepad4 extends JFrame implements ActionListener, DocumentListener {
    JMenu mFile, mEdit, mMode, mView, mHelp;
    // ---------------文件菜单
    JMenuItem mFile_New, mFile_Open, mFile_Save, mFile_ASave, mFile_Print, mFile_Exit;
    // ---------------编辑菜单
    JMenuItem mEdit_Undo, mEdit_Cut, mEdit_Copy, mEdit_Paste, mEdit_Del, mEdit_Search, mEdit_SearchNext, mEdit_Replace, mEdit_Turnto, mEdit_SelectAll, mEdit_TimeDate;
    // ---------------格式菜单
    JCheckBoxMenuItem formatMenu_LineWrap;
    JMenu formatMenu_Color;
    JMenuItem formatMenu_Font, formatMenu_Color_FgColor, formatMenu_Color_BgColor;
    // ---------------查看菜单
    JCheckBoxMenuItem viewMenu_Status;
    // ---------------帮助菜单
    JMenuItem mHelp_HelpTopics, mHelp_About;
    // ---------------弹出菜单级菜单项
    JPopupMenu popupMenu;
    JMenuItem popupMenu_Undo, popupMenu_Cut, popupMenu_Copy, popupMenu_Paste, popupMenu_Delete, popupMenu_SelectAll;
    // ---------------工具栏按钮
    JButton newButton, openButton, saveButton, saveAsButton, printButton, undoButton, redoButton, cutButton, copyButton, pasteButton, deleteButton, searchButton, timeButton, fontButton, boldButton,
            italicButton, fgcolorButton, bgcolorButton, helpButton;
    // 文本编辑区域
    static JTextArea Text;
    // 状态栏标签
    JLabel statusLabel1, statusLabel2, statusLabel3;
    JToolBar statusBar;
    // ---------------系统剪贴板
    Toolkit toolKit = Toolkit.getDefaultToolkit();
    Clipboard clipBoard = toolKit.getSystemClipboard();
    // ---------------创建撤消操作管理器
    protected UndoManager undo = new UndoManager();
    protected UndoableEditListener undoHandler = new UndoHandler();
    // ----------------其它变量
    boolean isNewFile = true; // 是否新文件(未保存过的)
    File currentFile; // 当前文件名
    String oldValue; // 存放编辑区原来的内容,用于比较文本是否有改动
    JButton fontOkButton; // 字体设置里的"确定"按钮
    // ----------------设置编辑区默认字体
    protected Font defaultFont = new Font("宋体", Font.PLAIN, 12);
    GregorianCalendar time = new GregorianCalendar();
    static int hour;
    static int min;
    static int second;
    File saveFileName = null, fileName = null;

    public Notepad4() {
        super("VXBB的记事本");
        setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        Container container = getContentPane();
        // System.out.println(Text.getDragEnabled()); //支持自动拖放
        JScrollPane scroll = new JScrollPane(Text);
        scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        
        Text.setWrapStyleWord(true); // 设置单词在一行不足容纳时换行
        Text.setLineWrap(true);
        Text.setFont(defaultFont); // 设置编辑区默认字体
        Text.setBackground(Color.white); // 设置编辑区默认背景色
        Text.setForeground(Color.black); // 设置编辑区默认前景色
        oldValue = Text.getText(); // 获取原文本编辑区的内容
        // --------------------------编辑区注册事件监听
        Text.getDocument().addUndoableEditListener(undoHandler); // 添加负责通知任何更改的撤消侦听器
        Text.getDocument().addDocumentListener(this); // 添加负责通知任何更改的文档侦听器
        JMenuBar MenuBar = new JMenuBar();
        mFile = new JMenu("文件(F)", true); // 创建菜单
        mEdit = new JMenu("编辑(E)", true);
        mMode = new JMenu("格式(O)", true);
        mView = new JMenu("查看(V)", true);
        mHelp = new JMenu("帮助(H)", true);
        mEdit.addActionListener(new ActionListener() // 注册事件监听
                {
                    public void actionPerformed(ActionEvent e) {
                        checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
                    }
                });
        mFile.setMnemonic('F');
        mEdit.setMnemonic('E');
        mMode.setMnemonic('O');
        mView.setMnemonic('V');
        mHelp.setMnemonic('H');
        MenuBar.add(mFile);
        MenuBar.add(mEdit);
        MenuBar.add(mMode);
        MenuBar.add(mView);
        MenuBar.add(mHelp);
        // --------------文件菜单
        mFile_New = new JMenuItem("新建(N)", 'N');
        mFile_Open = new JMenuItem("打开(O)", 'O');
        mFile_Save = new JMenuItem("保存(S)", 'S');
        mFile_ASave = new JMenuItem("另存为(A)", 'A');
        mFile_Print = new JMenuItem("打印(P)", 'P');
        mFile_Exit = new JMenuItem("退出(X)", 'X');
        mFile_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
        mFile_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
        mFile_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
        mFile_Print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
        mFile_New.addActionListener(this); // 注册事件监听
        mFile_Open.addActionListener(this);
        mFile_Save.addActionListener(this);
        mFile_ASave.addActionListener(this);
        mFile_Print.addActionListener(this);
        mFile_Exit.addActionListener(this);
        mFile.add(mFile_New); // 添加菜单项
        mFile.add(mFile_Open);
        mFile.add(mFile_Save);
        mFile.add(mFile_ASave);
        mFile.addSeparator(); // 添加分割线
        mFile.add(mFile_Print);
        mFile.addSeparator(); // 添加分割线
        mFile.add(mFile_Exit);

        // --------------编辑菜单
        mEdit_Undo = new JMenuItem("撤消(U)", 'U');
        mEdit_Cut = new JMenuItem("剪切(T)", 'T');
        mEdit_Copy = new JMenuItem("复制(C)", 'C');
        mEdit_Paste = new JMenuItem("粘贴(P)", 'P');
        mEdit_Del = new JMenuItem("删除(L)", 'L');
        mEdit_Search = new JMenuItem("查找(F)", 'F');
        mEdit_SearchNext = new JMenuItem("查找下一个(N)", 'N');
        mEdit_Replace = new JMenuItem("替换(R)", 'R');
        mEdit_Turnto = new JMenuItem("转到(G)", 'G');
        mEdit_SelectAll = new JMenuItem("全选(A)", 'A');
        mEdit_TimeDate = new JMenuItem("时间/日期(D)", 'D');
        mEdit_Cut.setEnabled(false);
        mEdit_Undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, InputEvent.CTRL_MASK));
        mEdit_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
        mEdit_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
        mEdit_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
        mEdit_Del.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
        mEdit_Search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
        mEdit_SearchNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0));
        mEdit_Replace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
        mEdit_Turnto.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
        mEdit_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
        mEdit_TimeDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5, 0));
        mEdit_Undo.addActionListener(this); // 注册事件监听
        mEdit_Cut.addActionListener(this);
        mEdit_Copy.addActionListener(this);
        mEdit_Paste.addActionListener(this);
        mEdit_Del.addActionListener(this);
        mEdit_Search.addActionListener(this);
        mEdit_SearchNext.addActionListener(this);
        mEdit_Replace.addActionListener(this);
        mEdit_Turnto.addActionListener(this);
        mEdit_SelectAll.addActionListener(this);
        mEdit_TimeDate.addActionListener(this);
        mEdit.add(mEdit_Undo); // 添加菜单项
        mEdit.addSeparator(); // 添加分割线
        mEdit.add(mEdit_Cut);
        mEdit.add(mEdit_Copy);
        mEdit.add(mEdit_Paste);
        mEdit.add(mEdit_Del);
        mEdit.addSeparator();
        mEdit.add(mEdit_Search);
        mEdit.add(mEdit_SearchNext);
        mEdit.add(mEdit_Replace);
        mEdit.add(mEdit_Turnto);
        mEdit.addSeparator();
        mEdit.add(mEdit_SelectAll);
        mEdit.add(mEdit_TimeDate);

        // --------------格式菜单
        formatMenu_LineWrap = new JCheckBoxMenuItem("自动换行(W)");
        formatMenu_LineWrap.setMnemonic('W');
        formatMenu_LineWrap.setState(true);
        formatMenu_Font = new JMenuItem("字体(F)", 'F');
        formatMenu_Color = new JMenu("颜色");
        formatMenu_Color_FgColor = new JMenuItem("字体颜色");
        formatMenu_Color_BgColor = new JMenuItem("背景颜色");
        formatMenu_LineWrap.addActionListener(this); // 注册事件监听
        formatMenu_Font.addActionListener(this);
        formatMenu_Color_FgColor.addActionListener(this);
        formatMenu_Color_BgColor.addActionListener(this);
        mMode.add(formatMenu_LineWrap); // 添加菜单项
        mMode.addSeparator();
        mMode.add(formatMenu_Font);
        mMode.add(formatMenu_Color);
        formatMenu_Color.add(formatMenu_Color_FgColor);
        formatMenu_Color.add(formatMenu_Color_BgColor);

        // --------------查看菜单
        viewMenu_Status = new JCheckBoxMenuItem("状态栏(S)");
        viewMenu_Status.setMnemonic('S');
        viewMenu_Status.setState(true);
        viewMenu_Status.addActionListener(this);
        mView.add(viewMenu_Status);

        // --------------帮助菜单
        mHelp_HelpTopics = new JMenuItem("帮助(H)", 'H');
        mHelp_About = new JMenuItem("关于(A)", 'A');
        mHelp_HelpTopics.addActionListener(this);
        mHelp_About.addActionListener(this);
        mHelp.add(mHelp_HelpTopics);
        mHelp.addSeparator(); // 添加分割线
        mHelp.add(mHelp_About);

        // -------------------创建右键弹出菜单
        popupMenu = new JPopupMenu();
        popupMenu_Undo = new JMenuItem("撤消(U)", 'U');
        popupMenu_Cut = new JMenuItem("剪切(T)", 'T');
        popupMenu_Copy = new JMenuItem("复制(C)", 'C');
        popupMenu_Paste = new JMenuItem("粘贴(P)", 'P');
        popupMenu_Delete = new JMenuItem("删除(D)", 'D');
        popupMenu_SelectAll = new JMenuItem("全选(A)", 'A');

        popupMenu_Undo.setEnabled(false); // 撤消选项初始设为不可用

        // ---------------向右键菜单添加菜单项和分隔符
        popupMenu.add(popupMenu_Undo);
        popupMenu.addSeparator();
        popupMenu.add(popupMenu_Cut);
        popupMenu.add(popupMenu_Copy);
        popupMenu.add(popupMenu_Paste);
        popupMenu.add(popupMenu_Delete);
        popupMenu.addSeparator();
        popupMenu.add(popupMenu_SelectAll);
        // --------------------右键菜单注册事件
        popupMenu_Undo.addActionListener(this);
        popupMenu_Cut.addActionListener(this);
        popupMenu_Copy.addActionListener(this);
        popupMenu_Paste.addActionListener(this);
        popupMenu_Delete.addActionListener(this);
        popupMenu_SelectAll.addActionListener(this);
        // --------------------文本编辑区注册右键菜单事件
        Text.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e) {
                checkForTriggerEvent(e);
            }

            public void mouseReleased(MouseEvent e) {
                checkForTriggerEvent(e);

            }

            private void checkForTriggerEvent(MouseEvent e) {
                if (e.isPopupTrigger())
                    popupMenu.show(e.getComponent(), e.getX(), e.getY());// 在组件调用者的坐标空间中的位置
                                                                            // X、Y
                                                                            // 显示弹出菜单。
                else {
                    statusLabel3.setText("当前光标所在行数: " + getlineNumber());
                }
                checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
                Text.requestFocus(); // 编辑区获取焦点
            }
        });

        // ----------------------------创建工具栏
        JPanel toolBar = new JPanel();
        toolBar.setLayout(new FlowLayout(FlowLayout.LEFT));

        Icon newIcon = new ImageIcon("Icons/new.gif");
        Icon openIcon = new ImageIcon("image/22.gif");
        Icon saveIcon = new ImageIcon("D:\\eclipse4.3.2\\workspace\\Test\\src\\image\\22.jpg");
        Icon saveAsIcon = new ImageIcon("Icons/saveas.gif");
        Icon printIcon = new ImageIcon("Icons/print.gif");
        Icon undoIcon = new ImageIcon("Icons/undo.gif");
        Icon cutIcon = new ImageIcon("Icons/cut.gif");
        Icon copyIcon = new ImageIcon("Icons/copy.gif");
        Icon pasteIcon = new ImageIcon("Icons/paste.gif");
        Icon deleteIcon = new ImageIcon("Icons/delete.gif");
        Icon searchIcon = new ImageIcon("Icons/search.gif");
        Icon timeIcon = new ImageIcon("Icons/time.gif");
        Icon fontIcon = new ImageIcon("Icons/font.gif");
        Icon boldIcon = new ImageIcon("Icons/bold.gif");
        Icon italicIcon = new ImageIcon("Icons/italic.gif");
        Icon bgcolorIcon = new ImageIcon("Icons/bgcolor.gif");
        Icon fgcolorIcon = new ImageIcon("Icons/fgcolor.gif");
        Icon helpIcon = new ImageIcon("Icons/help.gif");

        newButton = new JButton(newIcon);
        openButton = new JButton(openIcon);
        saveButton = new JButton(saveIcon);
        saveAsButton = new JButton(saveAsIcon);
        printButton = new JButton(printIcon);
        undoButton = new JButton(undoIcon);
        undoButton.setEnabled(false);
        cutButton = new JButton(cutIcon);
        cutButton.setEnabled(false);
        copyButton = new JButton(copyIcon);
        copyButton.setEnabled(false);
        pasteButton = new JButton(pasteIcon);
        pasteButton.setEnabled(false);
        deleteButton = new JButton(deleteIcon);
        deleteButton.setEnabled(false);
        searchButton = new JButton(searchIcon);
        timeButton = new JButton(timeIcon);
        fontButton = new JButton(fontIcon);
        boldButton = new JButton(boldIcon);
        italicButton = new JButton(italicIcon);
        fgcolorButton = new JButton(fgcolorIcon);
        bgcolorButton = new JButton(bgcolorIcon);
        helpButton = new JButton(helpIcon);

        newButton.setPreferredSize(new Dimension(22, 22));
        openButton.setPreferredSize(new Dimension(22, 22));
        saveButton.setPreferredSize(new Dimension(22, 22));
        saveAsButton.setPreferredSize(new Dimension(22, 22));
        printButton.setPreferredSize(new Dimension(22, 22));
        undoButton.setPreferredSize(new Dimension(22, 22));
        cutButton.setPreferredSize(new Dimension(22, 22));
        copyButton.setPreferredSize(new Dimension(22, 22));
        pasteButton.setPreferredSize(new Dimension(22, 22));
        deleteButton.setPreferredSize(new Dimension(22, 22));
        searchButton.setPreferredSize(new Dimension(22, 22));
        timeButton.setPreferredSize(new Dimension(22, 22));
        fontButton.setPreferredSize(new Dimension(22, 22));
        boldButton.setPreferredSize(new Dimension(22, 22));
        italicButton.setPreferredSize(new Dimension(22, 22));
        fgcolorButton.setPreferredSize(new Dimension(22, 22));
        bgcolorButton.setPreferredSize(new Dimension(22, 22));
        helpButton.setPreferredSize(new Dimension(22, 22));
        // -----------------------------------注册工具栏按钮事件
        newButton.addActionListener(this);
        openButton.addActionListener(this);
        saveButton.addActionListener(this);
        saveAsButton.addActionListener(this);
        printButton.addActionListener(this);
        undoButton.addActionListener(this);
        cutButton.addActionListener(this);
        copyButton.addActionListener(this);
        pasteButton.addActionListener(this);
        deleteButton.addActionListener(this);
        searchButton.addActionListener(this);
        timeButton.addActionListener(this);
        fontButton.addActionListener(this);
        boldButton.addActionListener(this);
        italicButton.addActionListener(this);
        fgcolorButton.addActionListener(this);
        bgcolorButton.addActionListener(this);
        helpButton.addActionListener(this);
        // ------------------------设置按钮提示文字
        newButton.setToolTipText("新建");
        openButton.setToolTipText("打开");
        saveButton.setToolTipText("保存");
        saveAsButton.setToolTipText("另存为");
        printButton.setToolTipText("打印");
        undoButton.setToolTipText("撤消");
        cutButton.setToolTipText("剪切");
        copyButton.setToolTipText("复制");
        pasteButton.setToolTipText("粘贴");
        deleteButton.setToolTipText("删除所选");
        searchButton.setToolTipText("查找与替换");
        timeButton.setToolTipText("插入时间/日期");
        fontButton.setToolTipText("设置字体");
        boldButton.setToolTipText("粗体");
        italicButton.setToolTipText("斜体");
        fgcolorButton.setToolTipText("设置字体颜色");
        bgcolorButton.setToolTipText("设置背景颜色");
        helpButton.setToolTipText("帮助");
        // 设置撤消、重做、剪切、复制、粘贴、删除等工具栏按钮不可用时的图片(灰色)
        undoButton.setDisabledIcon(new ImageIcon("D:\\eclipse4.3.2\\workspace\\Test\\src\\image\\22.jpg"));
        cutButton.setDisabledIcon(new ImageIcon("Icons/cut1.gif"));
        copyButton.setDisabledIcon(new ImageIcon("Icons/copy1.gif"));
        pasteButton.setDisabledIcon(new ImageIcon("Icons/paste1.gif"));
        deleteButton.setDisabledIcon(new ImageIcon("Icons/delete1.gif"));
        // ------------------------向工具栏添加按钮
        toolBar.add(newButton);
        toolBar.add(openButton);
        toolBar.add(saveButton);
        toolBar.add(saveAsButton);
        toolBar.add(printButton);
        toolBar.add(undoButton);
        toolBar.add(cutButton);
        toolBar.add(copyButton);
        toolBar.add(pasteButton);
        toolBar.add(deleteButton);
        toolBar.add(searchButton);
        toolBar.add(timeButton);
        toolBar.add(fontButton);
        toolBar.add(boldButton);
        toolBar.add(italicButton);
        toolBar.add(fgcolorButton);
        toolBar.add(bgcolorButton);
        toolBar.add(helpButton);

        // --------------------------------------向容器添加工具栏
        container.add(toolBar, BorderLayout.NORTH);
        // -----------------------------------创建和添加状态栏

        statusBar = new JToolBar();

        statusBar.setLayout(new FlowLayout(FlowLayout.LEFT));
        statusLabel1 = new JLabel("按F1获取帮助                ");
        statusLabel2 = new JLabel("    当前时间:" + hour + ":" + min + ":" + second);
        statusLabel3 = new JLabel("    当前光标所在行数" + getlineNumber());
        statusBar.add(statusLabel1);
        statusBar.addSeparator();
        statusBar.add(statusLabel2);
        statusBar.addSeparator();
        statusBar.add(statusLabel3);
        container.add(statusBar, BorderLayout.SOUTH);
        statusBar.setVisible(true);
        // ------------------------------------改变标题栏窗口左侧默认图标
        Toolkit tk = Toolkit.getDefaultToolkit();
        Image image = tk.createImage("Icons/notepad.gif");
        this.setIconImage(image);
        this.setJMenuBar(MenuBar); // 向窗口添加菜单条
        container.add(scroll, BorderLayout.CENTER); // 向容器添加文本编辑区
        this.pack();
        this.setSize(800, 800);
        this.setVisible(true);
        checkMenuItemEnabled();
        Text.requestFocus();
        //this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                checkText();
            }
        });
        Clock clock = new Clock();
        clock.start();
    }

    public void checkText() {
        Text.requestFocus();
        String currentValue = Text.getText();
        boolean isTextChange = (currentValue.equals(oldValue)) ? false : true;
        if (isTextChange) {

            int saveChoose = JOptionPane.showConfirmDialog(this, "您的文件尚未保存。是否保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION);

            if (saveChoose == JOptionPane.YES_OPTION) {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                fileChooser.setApproveButtonText("确定");
                fileChooser.setDialogTitle("另存为");

                int result = fileChooser.showSaveDialog(this);

                if (result == JFileChooser.CANCEL_OPTION) {
                    statusLabel1.setText("您没有选择任何文件");
                    return;
                }

                saveFileName = fileChooser.getSelectedFile();

                if (saveFileName == null || saveFileName.getName().equals(""))
                    JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                else {
                    saveFile();
                    Text.setText("");
                    this.setTitle("新建文本");
                    statusLabel1.setText(" 新建文本");
                }
            }

            else if (saveChoose == JOptionPane.NO_OPTION) {
                System.exit(0);
            }

            else if (saveChoose == JOptionPane.CANCEL_OPTION) {
                Text.requestFocus();
            }
        }

        else if (!isTextChange) {
            System.exit(0);
        }
    }

    public void checkMenuItemEnabled() {
        String selectText = Text.getSelectedText();

        if (selectText == null) {
            mEdit_Cut.setEnabled(false);
            popupMenu_Cut.setEnabled(false);
            cutButton.setEnabled(false);
            mEdit_Copy.setEnabled(false);
            popupMenu_Copy.setEnabled(false);
            copyButton.setEnabled(false);
            mEdit_Del.setEnabled(false);
            popupMenu_Delete.setEnabled(false);
            deleteButton.setEnabled(false);
        } else {
            mEdit_Cut.setEnabled(true);
            popupMenu_Cut.setEnabled(true);
            cutButton.setEnabled(true);
            mEdit_Copy.setEnabled(true);
            popupMenu_Copy.setEnabled(true);
            copyButton.setEnabled(true);
            mEdit_Del.setEnabled(true);
            popupMenu_Delete.setEnabled(true);
            deleteButton.setEnabled(true);
        }

        // 粘贴功能可用性判断
        Transferable contents = clipBoard.getContents(this);
        if (contents == null) {
            mEdit_Paste.setEnabled(false);
            popupMenu_Paste.setEnabled(false);
            pasteButton.setEnabled(false);
        } else {
            mEdit_Paste.setEnabled(true);
            popupMenu_Paste.setEnabled(true);
            pasteButton.setEnabled(true);
        }

    }

    public int getlineNumber() {
        int totalLine = Text.getLineCount();
        int[] lineNumber = new int[totalLine + 1];
        int pos = 0, t = 0, num = 0, i = 0;
        String s = Text.getText();
        while (true) {
            pos = s.indexOf('\12', pos); // 返回 \n 所在的位置
            if (pos == -1)
                break;
            lineNumber[t++] = pos++;
        }
        if (Text.getCaretPosition() <= lineNumber[0])
            num = 1;
        else {
            if (Text.getCaretPosition() > lineNumber[Text.getLineCount() - 1])
                num = Text.getLineCount();
            for (i = 0; i < totalLine + 1; i++) {
                if (Text.getCaretPosition() <= lineNumber[i]) {
                    num = i + 1;
                    break;
                } else
                    continue;
            }
        }
        return num;
    }

    public void saveFile() {
        try {
            FileWriter fw = new FileWriter(saveFileName);
            fw.write(Text.getText());
            fw.close();
        } catch (Exception e) {
        }
    }

    public void mySearch() {
        final JDialog findDialog = new JDialog(this, "查找与替换", true);
        Container con = findDialog.getContentPane();
        con.setLayout(new FlowLayout(FlowLayout.LEFT));
        JLabel searchContentLabel = new JLabel("查找内容(N) :");
        JLabel replaceContentLabel = new JLabel("替换为(P)  :");
        final JTextField findText = new JTextField(22);
        final JTextField replaceText = new JTextField(22);
        final JCheckBox matchcase = new JCheckBox("区分大小写");
        ButtonGroup bGroup = new ButtonGroup();
        final JRadioButton up = new JRadioButton("向上(U)");
        final JRadioButton down = new JRadioButton("向下(D)");
        down.setSelected(true);
        bGroup.add(up);
        bGroup.add(down);
        JButton searchNext = new JButton("查找下一个(F)");
        JButton replace = new JButton("替换(R)");
        final JButton replaceAll = new JButton("全部替换(A)");
        searchNext.setPreferredSize(new Dimension(110, 22));
        replace.setPreferredSize(new Dimension(110, 22));
        replaceAll.setPreferredSize(new Dimension(110, 22));
        // "替换"按钮的事件处理
        replace.addActionListener(new ActionListener() {
            
            public void actionPerformed(ActionEvent e) {
                

                if (replaceText.getText().length() == 0 && Text.getSelectedText() != null)
                    Text.replaceSelection("");
                if (replaceText.getText().length() > 0 && Text.getSelectedText() != null)
                    Text.replaceSelection(replaceText.getText());
            }
        });

        // "替换全部"按钮的事件处理
        replaceAll.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {

                Text.setCaretPosition(0); // 将光标放到编辑区开头
                int a = 0, b = 0, replaceCount = 0;

                if (findText.getText().length() == 0) {
                    JOptionPane.showMessageDialog(findDialog, "请填写查找内容!", "提示", JOptionPane.WARNING_MESSAGE);
                    findText.requestFocus(true);
                    return;
                }
                while (a > -1) {

                    int FindStartPos = Text.getCaretPosition();
                    String str1, str2, str3, str4, strA, strB;
                    str1 = Text.getText();
                    str2 = str1.toLowerCase();
                    str3 = findText.getText();
                    str4 = str3.toLowerCase();

                    if (matchcase.isSelected()) {
                        strA = str1;
                        strB = str3;
                    } else {
                        strA = str2;
                        strB = str4;
                    }

                    if (up.isSelected()) {
                        if (Text.getSelectedText() == null) {
                            a = strA.lastIndexOf(strB, FindStartPos - 1);
                        } else {
                            a = strA.lastIndexOf(strB, FindStartPos - findText.getText().length() - 1);
                        }
                    } else if (down.isSelected()) {
                        if (Text.getSelectedText() == null) {
                            a = strA.indexOf(strB, FindStartPos);
                        } else {
                            a = strA.indexOf(strB, FindStartPos - findText.getText().length() + 1);
                        }

                    }

                    if (a > -1) {
                        if (up.isSelected()) {
                            Text.setCaretPosition(a);
                            b = findText.getText().length();
                            Text.select(a, a + b);
                        } else if (down.isSelected()) {
                            Text.setCaretPosition(a);
                            b = findText.getText().length();
                            Text.select(a, a + b);
                        }
                    } else {
                        if (replaceCount == 0) {
                            JOptionPane.showMessageDialog(findDialog, "找不到您查找的内容!", "记事本", JOptionPane.INFORMATION_MESSAGE);
                        } else {
                            JOptionPane.showMessageDialog(findDialog, "成功替换" + replaceCount + "个匹配内容!", "替换成功", JOptionPane.INFORMATION_MESSAGE);
                        }
                    }
                    if (replaceText.getText().length() == 0 && Text.getSelectedText() != null) {
                        Text.replaceSelection("");
                        replaceCount++;
                    }
                    if (replaceText.getText().length() > 0 && Text.getSelectedText() != null) {
                        Text.replaceSelection(replaceText.getText());
                        replaceCount++;
                    }
                }// end while
            }
        }); /* "替换全部"按钮的事件处理结束 */

        // "查找下一个"按钮事件处理
        searchNext.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                int a = 0, b = 0;
                int FindStartPos = Text.getCaretPosition();
                String str1, str2, str3, str4, strA, strB;
                str1 = Text.getText();
                str2 = str1.toLowerCase();
                str3 = findText.getText();
                str4 = str3.toLowerCase();
                // "区分大小写"的CheckBox被选中
                if (matchcase.isSelected()) {
                    strA = str1;
                    strB = str3;
                } else {
                    strA = str2;
                    strB = str4;
                }

                if (up.isSelected()) {
                    if (Text.getSelectedText() == null) {
                        a = strA.lastIndexOf(strB, FindStartPos - 1);
                    } else {
                        a = strA.lastIndexOf(strB, FindStartPos - findText.getText().length() - 1);
                    }
                } else if (down.isSelected()) {
                    if (Text.getSelectedText() == null) {
                        a = strA.indexOf(strB, FindStartPos);
                    } else {
                        a = strA.indexOf(strB, FindStartPos - findText.getText().length() + 1);
                    }

                }
                if (a > -1) {
                    if (up.isSelected()) {
                        Text.setCaretPosition(a);
                        b = findText.getText().length();
                        Text.select(a, a + b);
                    } else if (down.isSelected()) {
                        Text.setCaretPosition(a);
                        b = findText.getText().length();
                        Text.select(a, a + b);
                    }
                } else {
                    JOptionPane.showMessageDialog(null, "找不到您查找的内容!", "记事本", JOptionPane.INFORMATION_MESSAGE);
                }

            }
        });/* "查找下一个"按钮事件处理结束 */
        // "取消"按钮及事件处理
        JButton cancel = new JButton("取消");
        cancel.setPreferredSize(new Dimension(110, 22));
        cancel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                findDialog.dispose();
            }
        });

        // 创建"查找与替换"对话框的界面
        JPanel bottomPanel = new JPanel();
        JPanel centerPanel = new JPanel();
        JPanel topPanel = new JPanel();

        JPanel direction = new JPanel();
        direction.setBorder(BorderFactory.createTitledBorder("方向 "));
        direction.add(up);
        direction.add(down);
        direction.setPreferredSize(new Dimension(170, 60));
        JPanel replacePanel = new JPanel();
        replacePanel.setLayout(new GridLayout(2, 1));
        replacePanel.add(replace);
        replacePanel.add(replaceAll);

        topPanel.add(searchContentLabel);
        topPanel.add(findText);
        topPanel.add(searchNext);
        centerPanel.add(replaceContentLabel);
        centerPanel.add(replaceText);
        centerPanel.add(replacePanel);
        bottomPanel.add(matchcase);
        bottomPanel.add(direction);
        bottomPanel.add(cancel);

        con.add(topPanel);
        con.add(centerPanel);
        con.add(bottomPanel);

        // 设置"查找与替换"对话框的大小、可更改大小(否)、位置和可见性
        findDialog.setSize(410, 210);
        findDialog.setResizable(false);
        findDialog.setLocation(230, 280);
        findDialog.setVisible(true);
    }

    /* 方法mySearch()结束 */

    // 实现ActionListener的事件处理方法public void actionPerformed(ActionEvent e)
    public void actionPerformed(ActionEvent e) {
        // 新建
        if (e.getActionCommand().equals("新建(N)") || e.getSource() == newButton)
        // 最初发生 Event 的对象
        // if(e.getSource()==mFile_New||e.getSource()==newButton)
        {
            Text.requestFocus();
            String currentValue = Text.getText();
            boolean isTextChange = (currentValue.equals(oldValue)) ? false : true;

            if (isTextChange) {

                int saveChoose = JOptionPane.showConfirmDialog(this, "您的文件尚未保存。是否保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION);

                if (saveChoose == JOptionPane.YES_OPTION) {
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    fileChooser.setApproveButtonText("确定");
                    fileChooser.setDialogTitle("另存为");
                    int result = fileChooser.showSaveDialog(this);
                    if (result == JFileChooser.CANCEL_OPTION) {
                        statusLabel1.setText("您没有选择任何文件");
                        return;
                    }
                    saveFileName = fileChooser.getSelectedFile();
                    if (saveFileName == null || saveFileName.getName().equals(""))
                        JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                    else {
                        saveFile();
                        Text.setText("");
                        this.setTitle("新建文本");
                        statusLabel1.setText(" 新建文本");
                    }
                } else if (saveChoose == JOptionPane.NO_OPTION) {
                    Text.replaceRange("", 0, Text.getText().length());
                    statusLabel1.setText(" 新建文件");
                    this.setTitle("无标题 - 记事本");
                    isNewFile = true;
                    undo.discardAllEdits(); // 撤消所有的"撤消"操作
                    mEdit_Undo.setEnabled(false);
                    popupMenu_Undo.setEnabled(false);
                    undoButton.setEnabled(false);
                    redoButton.setEnabled(false);
                    oldValue = Text.getText();
                } else if (saveChoose == JOptionPane.CANCEL_OPTION) {
                    return;
                }
            } else {
                // Text.replaceRange("", 0, Text.getText().length());
                Text.setText("");
                statusLabel1.setText(" 新建文件");
                this.setTitle("无标题 - 记事本");
                isNewFile = true;
                undo.discardAllEdits();
                mEdit_Undo.setEnabled(false);
                popupMenu_Undo.setEnabled(false);
                undoButton.setEnabled(false);
                oldValue = Text.getText();
            }
        }// 新建处理结束

        // 打开
        else if (e.getActionCommand().equals("打开(O)") || e.getSource() == openButton) {
            Text.requestFocus();
            String currentValue = Text.getText();
            boolean isTextChange = (currentValue.equals(oldValue)) ? false : true;

            if (isTextChange) {

                int saveChoose = JOptionPane.showConfirmDialog(this, "您的文件尚未保存。是否保存?", "提示", JOptionPane.YES_NO_CANCEL_OPTION);

                if (saveChoose == JOptionPane.YES_OPTION) {
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    fileChooser.setApproveButtonText("确定");
                    fileChooser.setDialogTitle("另存为");

                    int result = fileChooser.showSaveDialog(this);

                    if (result == JFileChooser.CANCEL_OPTION) {
                        statusLabel1.setText("您没有选择任何文件");
                        return;
                    }

                    saveFileName = fileChooser.getSelectedFile();

                    if (saveFileName == null || saveFileName.getName().equals(""))
                        JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                    else {
                        saveFile();
                        isNewFile = false;
                        currentFile = saveFileName;
                        oldValue = Text.getText();
                        this.setTitle(saveFileName.getName() + "  - 记事本");
                        statusLabel1.setText(" 当前打开文件:" + saveFileName.getAbsoluteFile());
                    }
                } else if (saveChoose == JOptionPane.NO_OPTION) {
                    String str = null;
                    JFileChooser fileChooser = new JFileChooser();
                    fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                    fileChooser.setApproveButtonText("确定");
                    fileChooser.setDialogTitle("打开文件");
                    int result = fileChooser.showOpenDialog(this);
                    if (result == JFileChooser.CANCEL_OPTION) {
                        statusLabel1.setText("您没有选择任何文件");
                        return;
                    }
                    fileName = fileChooser.getSelectedFile();
                    if (fileName == null || fileName.getName().equals(""))
                        JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                    else {
                        try {
                            FileReader fr = new FileReader(fileName);
                            BufferedReader bfr = new BufferedReader(fr);
                            Text.setText("");
                            while ((str = bfr.readLine()) != null) {// 每次读取一行,直到文件结束
                                Text.append(str + "\15\12");
                            }// endwhile
                            this.setTitle(fileName.getName() + "  - 记事本");
                            statusLabel1.setText(" 当前打开文件:" + fileName.getAbsoluteFile());
                            fr.close();
                            isNewFile = false;
                            currentFile = fileName;
                            oldValue = Text.getText();
                        } catch (IOException ioException) {
                        }
                    }
                } else {
                    return;
                }
            }

            else {
                String str = null;
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                fileChooser.setApproveButtonText("确定");
                fileChooser.setDialogTitle("打开文件");
                int result = fileChooser.showOpenDialog(this);
                if (result == JFileChooser.CANCEL_OPTION) {
                    statusLabel1.setText(" 您没有选择任何文件");
                    return;
                }
                fileName = fileChooser.getSelectedFile();
                if (fileName == null || fileName.getName().equals(""))
                    JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                else {
                    try {
                        FileReader fr = new FileReader(fileName);
                        BufferedReader bfr = new BufferedReader(fr);
                        Text.setText("");
                        while ((str = bfr.readLine()) != null) {// 每次读取一行,直到文件结束
                            Text.append(str + "\15\12");
                        }// endwhile

                        this.setTitle(fileName.getName() + "  - 记事本");
                        statusLabel1.setText(" 当前打开文件:" + fileName.getAbsoluteFile());
                        fr.close();
                        isNewFile = false;
                        currentFile = fileName;
                        oldValue = Text.getText();
                    } catch (IOException ioException) {
                    }
                }

            }
        }// "打开"处理结束

        // 保存
        else if (e.getSource() == mFile_Save || e.getSource() == saveButton) {
            Text.requestFocus();
            if (isNewFile) {
                JFileChooser fileChooser = new JFileChooser();
                fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
                fileChooser.setApproveButtonText("确定");
                fileChooser.setDialogTitle("另存为");
                int result = fileChooser.showSaveDialog(this);
                if (result == JFileChooser.CANCEL_OPTION) {
                    statusLabel1.setText(" 您没有选择任何文件");
                    return;
                }
                saveFileName = fileChooser.getSelectedFile();
                if (saveFileName == null || saveFileName.getName().equals(""))
                    JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
                else {
                    saveFile();
                    isNewFile = false;
                    currentFile = saveFileName;
                    oldValue = Text.getText();
                    this.setTitle(saveFileName.getName() + "  - 记事本");
                    statusLabel1.setText(" 当前打开文件:" + saveFileName.getAbsoluteFile());
                }
            } else {
                try {
                    FileWriter fw = new FileWriter(currentFile);
                    BufferedWriter bfw = new BufferedWriter(fw);
                    bfw.write(Text.getText(), 0, Text.getText().length());
                    bfw.flush();
                    fw.close();
                } catch (IOException ioException) {
                }
            }
        }// "保存"处理结束

        // 另存为
        else if (e.getSource() == mFile_ASave || e.getSource() == saveAsButton) {
            Text.requestFocus();
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            fileChooser.setApproveButtonText("确定");
            fileChooser.setDialogTitle("另存为");
            int result = fileChooser.showSaveDialog(this);
            if (result == JFileChooser.CANCEL_OPTION) {
                statusLabel1.setText(" 您没有选择任何文件");
                return;
            }
            saveFileName = fileChooser.getSelectedFile();
            if (saveFileName == null || saveFileName.getName().equals(""))
                JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
            else {
                saveFile();
                isNewFile = false;
                currentFile = saveFileName;
                oldValue = Text.getText();
                this.setTitle(saveFileName.getName() + "  - 记事本");
                statusLabel1.setText(" 当前打开文件:" + saveFileName.getAbsoluteFile());
            }

        }// "另存为"处理结束

        // 打印
        else if (e.getSource() == mFile_Print || e.getSource() == printButton) {
            Text.requestFocus();
            try {
                Text.print();
            } catch (PrinterException e1) {
                // TODO 自动生成的 catch 块
                e1.printStackTrace();
            }
//            JOptionPane.showMessageDialog(this, "此功能尚未添加!", "提示", JOptionPane.WARNING_MESSAGE);
        }

        // 退出
        else if (e.getSource() == mFile_Exit) {
            int exitChoose = JOptionPane.showConfirmDialog(this, "确定要退出么?", "退出提示", JOptionPane.OK_CANCEL_OPTION);
            if (exitChoose == JOptionPane.OK_OPTION) {
                checkText();
            } else {
                return;
            }
        }

        // 撤消
        else if (e.getSource() == mEdit_Undo || e.getSource() == popupMenu_Undo || e.getSource() == undoButton) {
            Text.requestFocus();
            if (undo.canUndo()) {
                try {
                    undo.undo();

                } catch (CannotUndoException ex) {
                    System.out.println("Unable to undo: " + ex);
                    ex.printStackTrace();
                }

                if (!undo.canUndo()) {
                    mEdit_Undo.setEnabled(false);
                    popupMenu_Undo.setEnabled(false);
                    undoButton.setEnabled(false);

                }
            }
        }

        // 剪切
        else if (e.getSource() == mEdit_Cut || e.getSource() == popupMenu_Cut || e.getSource() == cutButton) {
            Text.requestFocus();
            String text = Text.getSelectedText();
            StringSelection selection = new StringSelection(text);
            clipBoard.setContents(selection, null);
            Text.replaceRange("", Text.getSelectionStart(), Text.getSelectionEnd());
            checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
        }

        // 复制
        else if (e.getSource() == mEdit_Copy || e.getSource() == popupMenu_Copy || e.getSource() == copyButton) {
            Text.requestFocus();
            String text = Text.getSelectedText();
            StringSelection selection = new StringSelection(text);
            clipBoard.setContents(selection, null);
            checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
        }

        // 粘贴
        else if (e.getSource() == mEdit_Paste || e.getSource() == popupMenu_Paste || e.getSource() == pasteButton) {
            Text.requestFocus();
            Transferable contents = clipBoard.getContents(this);
            if (contents == null)
                return;
            String text;
            text = "";

            try {
                text = (String) contents.getTransferData(DataFlavor.stringFlavor);
            } catch (Exception exception) {
            }

            Text.replaceRange(text, Text.getSelectionStart(), Text.getSelectionEnd());
            checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
        }

        // 删除
        else if (e.getSource() == mEdit_Del || e.getSource() == popupMenu_Delete || e.getSource() == deleteButton) {
            Text.requestFocus();
            Text.replaceRange("", Text.getSelectionStart(), Text.getSelectionEnd());
            checkMenuItemEnabled(); // 设置剪切、复制、粘贴、删除等功能的可用性
        }

        // 查找
        else if (e.getSource() == mEdit_Search || e.getSource() == searchButton) {
            Text.requestFocus();
            if (e.getSource() == searchButton) {
                Text.requestFocus();
                Text.setCaretPosition(0);
            }
            mySearch();
        }

        // 查找下一个(此功能尚未能很好实现,所以就先用查找功能来代替)
        else if (e.getSource() == mEdit_SearchNext) {
            mySearch();
        }

        // 替换(与查找功能集成在一起了)
        else if (e.getSource() == mEdit_Replace) {
            mySearch();
        }

        // 转到
        else if (e.getSource() == mEdit_Turnto) {
            final JDialog gotoDialog = new JDialog(this, "转到下列行");
            JLabel gotoLabel = new JLabel("行数(L):");
            final JTextField linenum = new JTextField(5);
            linenum.setText("1");
            linenum.selectAll();

            JButton okButton = new JButton("确定");
            okButton.addActionListener(new ActionListener() {

                public void actionPerformed(ActionEvent e) {
                    int totalLine = Text.getLineCount();
                    int[] lineNumber = new int[totalLine + 1];
                    String s = Text.getText();
                    int pos = 0, t = 0;

                    while (true) {
                        pos = s.indexOf('\12', pos);
                        // System.out.println("引索pos:"+pos);
                        if (pos == -1)
                            break;
                        lineNumber[t++] = pos++;
                    }

                    int gt = 1;
                    try {
                        gt = Integer.parseInt(linenum.getText());
                    } catch (NumberFormatException efe) {
                        JOptionPane.showMessageDialog(null, "请输入行数!", "提示", JOptionPane.WARNING_MESSAGE);
                        linenum.requestFocus(true);
                        return;
                    }

                    if (gt < 2 || gt >= totalLine) {
                        if (gt < 2)
                            Text.setCaretPosition(0);
                        else
                            Text.setCaretPosition(s.length());
                    } else
                        Text.setCaretPosition(lineNumber[gt - 2] + 1);

                    gotoDialog.dispose();
                }

            });

            JButton cancelButton = new JButton("取消");
            cancelButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    gotoDialog.dispose();
                }
            });

            Container con = gotoDialog.getContentPane();
            con.setLayout(new FlowLayout());
            con.add(gotoLabel);
            con.add(linenum);
            con.add(okButton);
            con.add(cancelButton);

            gotoDialog.setSize(200, 100);
            gotoDialog.setResizable(false);
            gotoDialog.setLocation(300, 280);
            gotoDialog.setVisible(true);

        }// "转到"处理结束

        // 插入时间日期
        else if (e.getSource() == mEdit_TimeDate || e.getSource() == timeButton) {
            Text.requestFocus();
            SimpleDateFormat currentDateTime = new SimpleDateFormat("HH:mm yyyy-MM-dd");
            Text.insert(currentDateTime.format(new Date()), Text.getCaretPosition());
        }

        // 全选
        else if (e.getSource() == popupMenu_SelectAll || e.getSource() == mEdit_SelectAll) {
            Text.selectAll();
        }

        // 自动换行
        else if (e.getSource() == formatMenu_LineWrap) {
            if (formatMenu_LineWrap.getState()) {
                Text.setLineWrap(true);
            } else
                Text.setLineWrap(false);
        }

        // 字体设置
        else if (e.getSource() == formatMenu_Font || e.getSource() == fontButton) {
            Text.requestFocus();
            new MyFont();
        }

        // 设置字体颜色(前景色)
        else if (e.getSource() == formatMenu_Color_FgColor || e.getSource() == fgcolorButton) {
            Text.requestFocus();
            Color color = JColorChooser.showDialog(this, "更改字体颜色", Color.black);
            if (color != null) {
                Text.setForeground(color);
            } else
                return;
        }

        // 设置编辑区背景颜色
        else if (e.getSource() == formatMenu_Color_BgColor || e.getSource() == bgcolorButton) {
            Text.requestFocus();
            Color color = JColorChooser.showDialog(this, "更改背景颜色", Color.white);
            if (color != null) {
                Text.setBackground(color);
            } else
                return;
        }

        // 设置状态栏可见性
        else if (e.getSource() == viewMenu_Status) {
            if (viewMenu_Status.getState())//
                statusBar.setVisible(true);

            else
                statusBar.setVisible(false);

        }

        // 帮助主题
        else if (e.getSource() == mHelp_HelpTopics || e.getSource() == helpButton) {
            JOptionPane.showMessageDialog(this, "记事本支持拖入文本读取\n" + "由于对编码不熟悉保存文\n件时未进行编码转换\n", "帮助主题", JOptionPane.INFORMATION_MESSAGE);
        }

        // 关于
        else if (e.getSource() == mHelp_About) {
            JOptionPane.showMessageDialog(this, "       VXBB的记事本\n" + "     JAVA图形界面练习\n", "关于记事本", JOptionPane.INFORMATION_MESSAGE);
        }

        // 工具栏"粗体"按钮事件处理
        else if (e.getSource() == boldButton) {
            Text.requestFocus();
            Font tempFont = Text.getFont();

            if (Text.getFont().getStyle() == Font.PLAIN) {
                tempFont = new Font(Text.getFont().getFontName(), Font.BOLD, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == Font.ITALIC) {
                tempFont = new Font(Text.getFont().getFontName(), Font.BOLD + Font.ITALIC, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == Font.BOLD) {
                tempFont = new Font(Text.getFont().getFontName(), Font.PLAIN, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == (Font.BOLD + Font.ITALIC)) {
                tempFont = new Font(Text.getFont().getFontName(), Font.ITALIC, Text.getFont().getSize());
            }

            Text.setFont(tempFont);
        }

        // 工具栏"斜体"按钮事件处理
        else if (e.getSource() == italicButton) {
            Text.requestFocus();
            Font tempFont = Text.getFont();

            if (Text.getFont().getStyle() == Font.PLAIN) {
                tempFont = new Font(Text.getFont().getFontName(), Font.ITALIC, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == Font.ITALIC) {
                tempFont = new Font(Text.getFont().getFontName(), Font.PLAIN, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == Font.BOLD) {
                tempFont = new Font(Text.getFont().getFontName(), Font.BOLD + Font.ITALIC, Text.getFont().getSize());
            } else if (Text.getFont().getStyle() == (Font.BOLD + Font.ITALIC)) {
                tempFont = new Font(Text.getFont().getFontName(), Font.BOLD, Text.getFont().getSize());
            }

            Text.setFont(tempFont);
        }

    }/* 方法actionPerformed()结束 */

    class Clock extends Thread { // 模拟时钟
        public void run() {
            while (true) {
                GregorianCalendar time = new GregorianCalendar();
                 hour = time.get(Calendar.HOUR_OF_DAY);
                 min = time.get(Calendar.MINUTE);
                 second = time.get(Calendar.SECOND);
                statusLabel2.setText("    当前时间:" + hour + ":" + min + ":" + second);
                try {
                    Thread.sleep(950);
                } catch (InterruptedException exception) {
                }
            }
        }
    }

    // 用于设置字体的类MyFont
    class MyFont implements ActionListener {
        final JDialog fontDialog;
        final JTextField tfFont, tfSize, tfStyle;
        final int fontStyleConst[] = { Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD + Font.ITALIC };
        final JList listStyle, listFont, listSize;
        JLabel sample;
        JPanel pane1, pane2, pane3, pane4;

        // 构造函数MyFont
        public MyFont() {

            fontDialog = new JDialog(Notepad4.this, "字体设置", true);
            Container con = fontDialog.getContentPane();
            con.setLayout(new BoxLayout(con, BoxLayout.Y_AXIS));
            pane1 = new JPanel();
            pane2 = new JPanel();
            pane3 = new JPanel();
            pane4 = new JPanel();
            Font currentFont = Text.getFont();

            JLabel lblFont = new JLabel("字体(F):");
            JLabel lblStyle = new JLabel("字形(Y):");
            JLabel lblSize = new JLabel("大小(S):");

            lblStyle.setHorizontalAlignment(SwingConstants.CENTER);
            lblSize.setHorizontalAlignment(SwingConstants.CENTER);
            lblFont.setPreferredSize(new Dimension(91, 20));
            lblStyle.setPreferredSize(new Dimension(82, 20));
            lblSize.setPreferredSize(new Dimension(100, 20));
            tfFont = new JTextField(13);
            tfFont.setText(currentFont.getFontName());
            tfFont.selectAll();
            tfFont.setPreferredSize(new Dimension(200, 20));
            tfStyle = new JTextField(10);
            if (currentFont.getStyle() == Font.PLAIN)
                tfStyle.setText("常规");
            else if (currentFont.getStyle() == Font.BOLD)
                tfStyle.setText("粗体");
            else if (currentFont.getStyle() == Font.ITALIC)
                tfStyle.setText("斜体");
            else if (currentFont.getStyle() == (Font.BOLD + Font.ITALIC))
                tfStyle.setText("粗斜体");

            tfFont.selectAll();
            tfStyle.setPreferredSize(new Dimension(200, 20));
            tfSize = new JTextField(7);
            tfSize.setText(currentFont.getSize() + "");
            tfSize.selectAll();
            tfSize.setPreferredSize(new Dimension(200, 20));

            final String fontStyle[] = { "常规", "粗体", "斜体", "粗斜体" };
            listStyle = new JList(fontStyle);

            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            final String fontName[] = ge.getAvailableFontFamilyNames();
            int defaultFontIndex = 0;
            for (int i = 0; i < fontName.length; i++) {
                if (fontName[i].equals(currentFont.getFontName())) {
                    defaultFontIndex = i;
                    break;
                }
            }
            listFont = new JList(fontName);
            listFont.setSelectedIndex(defaultFontIndex);
            listFont.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            listFont.setVisibleRowCount(7);
            listFont.setFixedCellWidth(99);
            listFont.setFixedCellHeight(20);
            listFont.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent event) {
                    tfFont.setText(fontName[listFont.getSelectedIndex()]);
                    tfFont.requestFocus();
                    tfFont.selectAll();
                    updateSample();
                }
            });

            listStyle.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            if (currentFont.getStyle() == Font.PLAIN)
                listStyle.setSelectedIndex(0);
            else if (currentFont.getStyle() == Font.BOLD)
                listStyle.setSelectedIndex(1);
            else if (currentFont.getStyle() == Font.ITALIC)
                listStyle.setSelectedIndex(2);
            else if (currentFont.getStyle() == (Font.BOLD + Font.ITALIC))
                listStyle.setSelectedIndex(3);

            listStyle.setVisibleRowCount(7);
            listStyle.setFixedCellWidth(85);
            listStyle.setFixedCellHeight(20);
            listStyle.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent event) {
                    tfStyle.setText(fontStyle[listStyle.getSelectedIndex()]);
                    tfStyle.requestFocus();
                    tfStyle.selectAll();
                    updateSample();
                }
            });

            final String fontSize[] = { "8", "9", "10", "11", "12", "14", "16", "18", "20", "22", "24", "26", "28", "36", "48", "72" };
            listSize = new JList(fontSize);
            int defaultFontSizeIndex = 0;
            for (int i = 0; i < fontSize.length; i++) {
                if (fontSize[i].equals(currentFont.getSize() + "")) {
                    defaultFontSizeIndex = i;
                    break;
                }
            }
            listSize.setSelectedIndex(defaultFontSizeIndex);

            listSize.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
            listSize.setVisibleRowCount(7);
            listSize.setFixedCellWidth(50);
            listSize.setFixedCellHeight(20);
            listSize.addListSelectionListener(new ListSelectionListener() {
                public void valueChanged(ListSelectionEvent event) {
                    tfSize.setText(fontSize[listSize.getSelectedIndex()]);
                    tfSize.requestFocus();
                    tfSize.selectAll();
                    updateSample();
                }
            });
            fontOkButton = new JButton("确定");
            fontOkButton.addActionListener(this);
            JButton cancelButton = new JButton("取消");
            cancelButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    fontDialog.dispose();
                }
            });

            sample = new JLabel(" 记事本 ");
            sample.setHorizontalAlignment(SwingConstants.CENTER);
            sample.setPreferredSize(new Dimension(150, 31));

            JPanel samplePanel = new JPanel();
            samplePanel.setBorder(BorderFactory.createTitledBorder("示例"));
            samplePanel.add(sample);

            pane1.add(lblFont);
            pane1.add(lblStyle);
            pane1.add(lblSize);
            pane2.add(tfFont);
            pane2.add(tfStyle);
            pane2.add(tfSize);

            pane3.add(new JScrollPane(listFont));
            pane3.add(new JScrollPane(listStyle));
            pane3.add(new JScrollPane(listSize));
            pane4.add(samplePanel);
            pane4.add(fontOkButton);
            pane4.add(cancelButton);
            con.add(pane1);
            con.add(pane2);
            con.add(pane3);
            con.add(pane4);
            updateSample();

            fontDialog.pack();
            fontDialog.setSize(400, 400);
            fontDialog.setLocation(200, 200);
            fontDialog.setResizable(false);
            fontDialog.setVisible(true);
        }// 构造函数结束

        // 更新示例显示的字体和风格大小等
        public void updateSample() {
            Font sampleFont = new Font(tfFont.getText(), fontStyleConst[listStyle.getSelectedIndex()], Integer.parseInt(tfSize.getText()));
            sample.setFont(sampleFont);
        }// End method updateSample

        // 设置文本编辑区的字体
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == fontOkButton) {
                Font tempFont = new Font(tfFont.getText(), fontStyleConst[listStyle.getSelectedIndex()], Integer.parseInt(tfSize.getText()));
                Text.setFont(tempFont);
                fontDialog.dispose();
            }
        }// End method actionPerformed
    }/* End of class MyFont */

    public void removeUpdate(DocumentEvent e) {
        mEdit_Undo.setEnabled(true);
        popupMenu_Undo.setEnabled(true);
        undoButton.setEnabled(true);
    }

    public void insertUpdate(DocumentEvent e) {
        mEdit_Undo.setEnabled(true);
        popupMenu_Undo.setEnabled(true);
        undoButton.setEnabled(true);
    }

    public void changedUpdate(DocumentEvent e) {
        mEdit_Undo.setEnabled(true);
        popupMenu_Undo.setEnabled(true);
        undoButton.setEnabled(true);
    }

    // End of DocumentListener

    // 实现了接口UndoableListener的类UndoHandler
    class UndoHandler implements UndoableEditListener {
        public void undoableEditHappened(UndoableEditEvent uee) {
            undo.addEdit(uee.getEdit());
        }
    }

    public static void main(String s[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException, UnsupportedLookAndFeelException {

        // UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        Text = new JTextArea();
        Text.setDragEnabled(true); // 支持自动拖放
        DndTargetListener    dnd = new DndTargetListener(Text);//为textArea添加对拖拽效果的支持
        Text.setDropTarget(new DropTarget(Text, DnDConstants.ACTION_REFERENCE,
                dnd, true));        
        new Notepad4();
//        Text.setTransferHandler(new FileTransferHandler(Text));
    }
}
//拖拽效果演示的是释放文件后读取文件内容
class DndTargetListener implements DropTargetListener {
    JTextArea Text;
    BufferedReader br;
    String line;
    public DndTargetListener(JTextArea Text){
        this.Text=Text;
    }
    
    @Override
    public void dragEnter(DropTargetDragEvent arg0) {//我们当然不想什么文件都可以拖到该窗口内,如exe文件、com文件等,所以我们要过滤掉一些文件。这个需求我们可以在dragEnter方法中进行处理
        
        if (!arg0.isDataFlavorSupported(DataFlavor.javaFileListFlavor)
                && !arg0.isDataFlavorSupported(DataFlavor.stringFlavor)) {
            arg0.rejectDrag();
        }

    }

    @Override
    public void dragExit(DropTargetEvent arg0) {

    }

    @Override
    public void dragOver(DropTargetDragEvent arg0) {//“拖拽经过”动作和“拖拽进入”操作相同,也可不做处理
    }

    @Override
    public void drop(DropTargetDropEvent arg0) {//处理拖拽释放动作,即实现drop方法
        arg0.acceptDrop(DnDConstants.ACTION_REFERENCE);
        if (arg0.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
            try {
                Transferable tf = arg0.getTransferable();
                List<File> list = (List<File>) tf
                        .getTransferData(DataFlavor.javaFileListFlavor);
                for (File f : list) {
                    if (f.exists() && f.isFile()) {
                        Text.append(f.getAbsolutePath() + "\n");
                        Text.append("======================\n");
                        br = new BufferedReader(new FileReader(f));
                        while ((line = br.readLine()) != null)
                            Text.append(line + "\n");
                        br.close();
                    } else if (f.exists() && f.isDirectory()) {
                        // 这里不对拖拽文件夹做操作
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    @Override
    public void dropActionChanged(DropTargetDragEvent arg0) {
    }
}


//class FileTransferHandler extends TransferHandler {
//    JTextArea Text;
//
//    public FileTransferHandler(JTextArea Text) {
//        this.Text = Text;
//    }
//
//    public boolean importData(JComponent c, Transferable t) {
//        try {
////            List files = (List) t.getTransferData(DataFlavor.javaFileListFlavor);
//            List<File> files = (List<File>) t.getTransferData(DataFlavor.javaFileListFlavor);
//            addFilesToFilePathList(files);
//            return true;
//        } catch (UnsupportedFlavorException ufe) {
//            ufe.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return false;
//    }
//
//    public boolean canImport(JComponent c, DataFlavor[] flavors) {
//        for (int i = 0; i < flavors.length; i++) {
//            if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
//                return true;
//            }
//        }
//        return false;
//    }
//
//    private void addFilesToFilePathList(List files) {
//        for (Iterator iter = files.iterator(); iter.hasNext();) {
//            File file = (File) iter.next();
//            String str = null;
//            try {
//                FileReader fr = new FileReader(file);
//                BufferedReader bfr = new BufferedReader(fr);
//                Text.setText("");
//                while ((str = bfr.readLine()) != null) {
//                    Text.append(str + "\15\12");
//                }
//            } catch (Exception b) {
//            }
//        }
//    }
//}

0 0