package lianxi; //抄作业要记得改包名
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.*;
import java.io.*;
import javax.swing.undo.*;
import javax.swing.border.*;
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
public class Notepad extends JFrame implements ActionListener,DocumentListener { //把原有的class名改为Notepad
JMenu fileMenu,editMenu,formatMenu,viewMenu,helpMenu;
//右键弹出菜单项
JPopupMenu popupMenu;
JMenuItem popupMenu_Undo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;
//“文件”的菜单项
JMenuItem fileMenu_New,fileMenu_Open,fileMenu_Save,fileMenu_SaveAs,fileMenu_PageSetUp,fileMenu_Print,fileMenu_Exit;
//“编辑”的菜单项
JMenuItem editMenu_Undo,editMenu_Cut,editMenu_Copy,editMenu_Paste,editMenu_Delete,editMenu_Find,editMenu_FindNext,editMenu_Replace,editMenu_GoTo,editMenu_SelectAll,editMenu_TimeDate;
//“格式”的菜单项
JCheckBoxMenuItem formatMenu_LineWrap;
JMenuItem formatMenu_Font;
//“查看”的菜单项
JCheckBoxMenuItem viewMenu_Status;
//“帮助”的菜单项
JMenuItem helpMenu_HelpTopics,helpMenu_AboutNotepad;
//“文本”编辑区域
JTextArea editArea;
//状态栏标签
JLabel statusLabel;
//系统剪贴板
Toolkit toolkit=Toolkit.getDefaultToolkit();
Clipboard clipBoard=toolkit.getSystemClipboard();
//创建撤销操作管理器(与撤销操作有关)
protected UndoManager undo=new UndoManager();
protected UndoableEditListener undoHandler=new UndoHandler();
//其他变量
String oldValue;//存放编辑区原来的内容,用于比较文本是否有改动
boolean isNewFile=true;//是否新文件(未保存过的)
File currentFile;//当前文件名
//构造函数开始
public Notepad()
{
super("Java记事本");
//改变系统默认字体
Font font = new Font("Dialog", Font.PLAIN, 12);
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, font);
}
}
//创建菜单条
JMenuBar menuBar=new JMenuBar();
//创建文件菜单及菜单项并注册事件监听
fileMenu=new JMenu("文件(F)");
fileMenu.setMnemonic('F');//设置快捷键ALT+F
fileMenu_New=new JMenuItem("新建(N)");
fileMenu_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N,InputEvent.CTRL_MASK));
fileMenu_New.addActionListener(this);
fileMenu_Open=new JMenuItem("打开(O)...");
fileMenu_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,InputEvent.CTRL_MASK));
fileMenu_Open.addActionListener(this);
fileMenu_Save=new JMenuItem("保存(S)");
fileMenu_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,InputEvent.CTRL_MASK));
fileMenu_Save.addActionListener(this);
fileMenu_SaveAs=new JMenuItem("另存为(A)...");
fileMenu_SaveAs.addActionListener(this);
fileMenu_PageSetUp=new JMenuItem("页面设置(U)...");
fileMenu_PageSetUp.addActionListener(this);
fileMenu_Print=new JMenuItem("打印(P)...");
fileMenu_Print.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, InputEvent.CTRL_MASK));
fileMenu_Print.addActionListener(this);
fileMenu_Exit=new JMenuItem("退出(X)");
fileMenu_Exit.addActionListener(this);
//创建编辑菜单及菜单项并注册事件监听
editMenu=new JMenu("编辑(E)");
editMenu.setMnemonic('E');//设置快捷键ALT+E
//当选择编辑菜单时,设置剪切、复制、粘贴、删除等功能的可用性
editMenu.addMenuListener(new MenuListener()
{ public void menuCanceled(MenuEvent e)//取消菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuDeselected(MenuEvent e)//取消选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
public void menuSelected(MenuEvent e)//选择某个菜单时调用
{ checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
});
editMenu_Undo=new JMenuItem("撤销(U)");
editMenu_Undo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z,InputEvent.CTRL_MASK));
editMenu_Undo.addActionListener(this);
editMenu_Undo.setEnabled(false);
editMenu_Cut=new JMenuItem("剪切(T)");
editMenu_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,InputEvent.CTRL_MASK));
editMenu_Cut.addActionListener(this);
editMenu_Copy=new JMenuItem("复制(C)");
editMenu_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,InputEvent.CTRL_MASK));
editMenu_Copy.addActionListener(this);
editMenu_Paste=new JMenuItem("粘贴(P)");
editMenu_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,InputEvent.CTRL_MASK));
editMenu_Paste.addActionListener(this);
editMenu_Delete=new JMenuItem("删除(D)");
editMenu_Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
editMenu_Delete.addActionListener(this);
editMenu_Find=new JMenuItem("查找(F)...");
editMenu_Find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F,InputEvent.CTRL_MASK));
editMenu_Find.addActionListener(this);
editMenu_FindNext=new JMenuItem("查找下一个(N)");
editMenu_FindNext.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
editMenu_FindNext.addActionListener(this);
editMenu_Replace = new JMenuItem("替换(R)...",'R');
editMenu_Replace.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_H, InputEvent.CTRL_MASK));
editMenu_Replace.addActionListener(this);
editMenu_GoTo = new JMenuItem("转到(G)...",'G');
editMenu_GoTo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
editMenu_GoTo.addActionListener(this);
editMenu_SelectAll = new JMenuItem("全选",'A');
editMenu_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
editMenu_SelectAll.addActionListener(this);
editMenu_TimeDate = new JMenuItem("时间/日期(D)",'D');
editMenu_TimeDate.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
editMenu_TimeDate.addActionListener(this);
//创建格式菜单及菜单项并注册事件监听
formatMenu=new JMenu("格式(O)");
formatMenu.setMnemonic('O');//设置快捷键ALT+O
formatMenu_LineWrap=new JCheckBoxMenuItem("自动换行(W)");
formatMenu_LineWrap.setMnemonic('W');//设置快捷键ALT+W
formatMenu_LineWrap.setState(true);
formatMenu_LineWrap.addActionListener(this);
formatMenu_Font=new JMenuItem("字体(F)...");
formatMenu_Font.addActionListener(this);
//创建查看菜单及菜单项并注册事件监听
viewMenu=new JMenu("查看(V)");
viewMenu.setMnemonic('V');//设置快捷键ALT+V
viewMenu_Status=new JCheckBoxMenuItem("状态栏(S)");
viewMenu_Status.setMnemonic('S');//设置快捷键ALT+S
viewMenu_Status.setState(true);
viewMenu_Status.addActionListener(this);
//创建帮助菜单及菜单项并注册事件监听
helpMenu = new JMenu("帮助(H)");
helpMenu.setMnemonic('H');//设置快捷键ALT+H
helpMenu_HelpTopics = new JMenuItem("帮助主题(H)");
helpMenu_HelpTopics.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
helpMenu_HelpTopics.addActionListener(this);
helpMenu_AboutNotepad = new JMenuItem("关于记事本(A)");
helpMenu_AboutNotepad.addActionListener(this);
//向菜单条添加"文件"菜单及菜单项
menuBar.add(fileMenu);
fileMenu.add(fileMenu_New);
fileMenu.add(fileMenu_Open);
fileMenu.add(fileMenu_Save);
fileMenu.add(fileMenu_SaveAs);
fileMenu.addSeparator(); //分隔线
fileMenu.add(fileMenu_PageSetUp);
fileMenu.add(fileMenu_Print);
fileMenu.addSeparator(); //分隔线
fileMenu.add(fileMenu_Exit);
//向菜单条添加"编辑"菜单及菜单项
menuBar.add(editMenu);
editMenu.add(editMenu_Undo);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_Cut);
editMenu.add(editMenu_Copy);
editMenu.add(editMenu_Paste);
editMenu.add(editMenu_Delete);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_Find);
editMenu.add(editMenu_FindNext);
editMenu.add(editMenu_Replace);
editMenu.add(editMenu_GoTo);
editMenu.addSeparator(); //分隔线
editMenu.add(editMenu_SelectAll);
editMenu.add(editMenu_TimeDate);
//向菜单条添加"格式"菜单及菜单项
menuBar.add(formatMenu);
formatMenu.add(formatMenu_LineWrap);
formatMenu.add(formatMenu_Font);
//向菜单条添加"查看"菜单及菜单项
menuBar.add(viewMenu);
viewMenu.add(viewMenu_Status);
//向菜单条添加"帮助"菜单及菜单项
menuBar.add(helpMenu);
helpMenu.add(helpMenu_HelpTopics);
helpMenu.addSeparator();
helpMenu.add(helpMenu_AboutNotepad);
//向窗口添加菜单条
this.setJMenuBar(menuBar);
//创建文本编辑区并添加滚动条
editArea=new JTextArea(20,50);
JScrollPane scroller=new JScrollPane(editArea);
scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
this.add(scroller,BorderLayout.CENTER);//向窗口添加文本编辑区
editArea.setWrapStyleWord(true);//设置单词在一行不足容纳时换行
editArea.setLineWrap(true);//设置文本编辑区自动换行默认为true,即会"自动换行"
//this.add(editArea,BorderLayout.CENTER);//向窗口添加文本编辑区
oldValue=editArea.getText();//获取原文本编辑区的内容
//编辑区注册事件监听(与撤销操作有关)
editArea.getDocument().addUndoableEditListener(undoHandler);
editArea.getDocument().addDocumentListener(this);
//创建右键弹出菜单
popupMenu=new JPopupMenu();
popupMenu_Undo=new JMenuItem("撤销(U)");
popupMenu_Cut=new JMenuItem("剪切(T)");
popupMenu_Copy=new JMenuItem("复制(C)");
popupMenu_Paste=new JMenuItem("粘帖(P)");
popupMenu_Delete=new JMenuItem("删除(D)");
popupMenu_SelectAll=new JMenuItem("全选(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);
//文本编辑区注册右键菜单事件
editArea.addMouseListener(new MouseAdapter()
{ public void mousePressed(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空间中的位置 X、Y 显示弹出菜单
}
checkMenuItemEnabled();//设置剪切,复制,粘帖,删除等功能的可用性
editArea.requestFocus();//编辑区获取焦点
}
public void mouseReleased(MouseEvent e)
{ if(e.isPopupTrigger())//返回此鼠标事件是否为该平台的弹出菜单触发事件
{ popupMenu.show(e.getComponent(),e.getX(),e.getY());//在组件调用者的坐标空