📄 notebook.txt
字号:
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 NoteBook extends JFrame implements ActionListener,DocumentListener{
//定义变量
//菜单
JMenu fileMenu,editMenu,formatMenu,helpMenu;
//"文件"的菜单项
JMenuItem fileMenu_New,fileMenu_Open,fileMenu_Save,fileMenu_SaveAs,fileMenu_Exit;
//"编辑"的菜单项
JMenuItem editMenu_Undo,editMenu_Cut,editMenu_Copy,editMenu_Paste,editMenu_Delete,editMenu_Find,editMenu_FindNext,editMenu_Replace,
editMenu_SelectAll,editMenu_TimeDate;
//"格式"的菜单项
JCheckBoxMenuItem formatMenu_LineWrap;
JMenuItem formatMenu_Font;
//"帮助"的菜单项
JMenuItem helpMenu_HelpTopics,helpMenu_About;
//文本编辑区域
JTextArea editArea;
//弹出菜单及菜单项
JPopupMenu popupMenu;
JMenuItem popupMenu_Undo,popupMenu_Cut,popupMenu_Copy,popupMenu_Paste,popupMenu_Delete,popupMenu_SelectAll;
//系统剪贴板
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);
//构造函数开始
public NoteBook()
{
super("记事本");
//获取容器
Container container=getContentPane();
//创建文件菜单及菜单项并注册事件监听
JMenuBar menuBar = new JMenuBar();
JMenu fileMenu = new JMenu("文件(F)", true);
fileMenu.setMnemonic('F');
fileMenu_New = new JMenuItem("新建(N)", 'N');
fileMenu_New.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_MASK));
fileMenu_New.addActionListener(this);
fileMenu_Open = new JMenuItem("打开(O)...", 'O');
fileMenu_Open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
fileMenu_Open.addActionListener(this);
fileMenu_Save = new JMenuItem("保存(S)", 'S');
fileMenu_Save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
fileMenu_Save.addActionListener(this);
fileMenu_SaveAs = new JMenuItem("另存为(A)...", 'A');
fileMenu_SaveAs.addActionListener(this);
fileMenu_Exit = new JMenuItem("退出(X)",'X');
fileMenu_Exit.addActionListener(this);
//创建编辑菜单及菜单项并注册事件监听
JMenu editMenu = new JMenu("编辑(E)", true);
editMenu.setMnemonic('E');
editMenu.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e){
checkMenuItemEnabled();//设置剪切、复制、粘贴、删除等功能的可用性
}
}
);
editMenu_Undo = new JMenuItem("撤消(U)",'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)",'T');
editMenu_Cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
editMenu_Cut.addActionListener(this);
editMenu_Copy = new JMenuItem("复制(C)",'C');
editMenu_Copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
editMenu_Copy.addActionListener(this);
editMenu_Paste = new JMenuItem("粘贴(P)",'P');
editMenu_Paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
editMenu_Paste.addActionListener(this);
editMenu_Delete = new JMenuItem("删除(L)",'L');
editMenu_Delete.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0));
editMenu_Delete.addActionListener(this);
editMenu_Find = new JMenuItem("查找(F)...",'F');
editMenu_Find.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, InputEvent.CTRL_MASK));
editMenu_Find.addActionListener(this);
editMenu_FindNext = new JMenuItem("查找下一个(N)",'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_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);
//创建格式菜单及菜单项并注册事件监听
JMenu formatMenu = new JMenu("格式(O)", true);
formatMenu.setMnemonic('O');
formatMenu_LineWrap = new JCheckBoxMenuItem("自动换行(W)");
formatMenu_LineWrap.setMnemonic('W');
formatMenu_LineWrap.setState(true);
formatMenu_LineWrap.addActionListener(this);
formatMenu_Font = new JMenuItem("字体(F)...",'F');
formatMenu_Font.addActionListener(this);
//创建帮助菜单及菜单项并注册事件监听
JMenu helpMenu = new JMenu("帮助(H)", true);
helpMenu.setMnemonic('H');
helpMenu_HelpTopics = new JMenuItem("帮助主题(H)",'H');
helpMenu_HelpTopics.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1,0));
helpMenu_HelpTopics.addActionListener(this);
helpMenu_About = new JMenuItem("关于...(A)",'A');
helpMenu_About.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_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.addSeparator(); //分隔线
editMenu.add(editMenu_SelectAll);
editMenu.add(editMenu_TimeDate);
//向菜单条添加"格式"菜单及菜单项
menuBar.add(formatMenu);
formatMenu.add(formatMenu_LineWrap);
formatMenu.add(formatMenu_Font);
//向菜单条添加"帮助"菜单及菜单项
menuBar.add(helpMenu);
helpMenu.add(helpMenu_HelpTopics);
helpMenu.addSeparator();
helpMenu.add(helpMenu_About);
//向窗口添加菜单条
this.setJMenuBar(menuBar);
//创建文本编辑区并添加滚动条
editArea=new JTextArea(20,50);
JScrollPane scroller=new JScrollPane(editArea);
container.add(scroller,BorderLayout.CENTER);//向容器添加文本编辑区
editArea.setWrapStyleWord(true); //设置单词在一行不足容纳时换行
editArea.setLineWrap(true); //设置文本编辑区自动换行默认为true,即会"自动换行"
editArea.setFont(defaultFont); //设置编辑区默认字体
oldValue=editArea.getText(); //获取原文本编辑区的内容
//编辑区注册事件监听
editArea.getDocument().addUndoableEditListener(undoHandler);
editArea.getDocument().addDocumentListener(this);
//创建右键弹出菜单
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);
//文本编辑区注册右键菜单事件
editArea.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());
checkMenuItemEnabled(); //设置剪切、复制、粘贴、删除等功能的可用性
editArea.requestFocus(); //编辑区获取焦点
}
});
//设置窗口在屏幕上的位置、大小和可见性
this.setLocation(100,100);
this.setSize(650,550);
this.setVisible(true);
checkMenuItemEnabled();
editArea.requestFocus();
} /*构造函数NoteBook结束*/
//设置菜单项的可用性:剪切,复制,粘贴,删除功能
public void checkMenuItemEnabled(){
/*
*思路:
*主要是通过判断编辑区是否有文本被选中来设置这些操作(剪切,复制,删除)的可用性;
*通过判断剪贴板信息设置粘贴选项的可用性
*
**/
String selectText=editArea.getSelectedText();
if(selectText==null)
{
editMenu_Cut.setEnabled(false);
popupMenu_Cut.setEnabled(false);
editMenu_Copy.setEnabled(false);
popupMenu_Copy.setEnabled(false);
editMenu_Delete.setEnabled(false);
popupMenu_Delete.setEnabled(false);
}
else
{
editMenu_Cut.setEnabled(true);
popupMenu_Cut.setEnabled(true);
editMenu_Copy.setEnabled(true);
popupMenu_Copy.setEnabled(true);
editMenu_Delete.setEnabled(true);
popupMenu_Delete.setEnabled(true);
}
//粘贴功能可用性判断
Transferable contents=clipBoard.getContents(this);
if(contents==null)
{
editMenu_Paste.setEnabled(false);
popupMenu_Paste.setEnabled(false);
}
else
{
editMenu_Paste.setEnabled(true);
popupMenu_Paste.setEnabled(true);
}
}/*方法checkMenuItemEnabled()结束*/
//查找与替换功能
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(30);
final JTextField replaceText=new JTextField(30);
final JCheckBox matchcase =new JCheckBox("区分大小写(C)");
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)");
//"替换"按钮的事件处理
replace.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
if(replaceText.getText().length() == 0 && editArea.getSelectedText()!=null)
editArea.replaceSelection("");
if(replaceText.getText().length() > 0 && editArea.getSelectedText()!= null)
editArea.replaceSelection(replaceText.getText());
}
});
//"替换全部"按钮的事件处理
replaceAll.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
editArea.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=editArea.getCaretPosition();
String str1, str2, str3, str4, strA, strB;
str1 = editArea.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(editArea.getSelectedText()==null){
a = strA.lastIndexOf(strB, FindStartPos-1);
}
else
{
a = strA.lastIndexOf(strB, FindStartPos-findText.getText().length()-1);
}
}
else if(down.isSelected())
{
if(editArea.getSelectedText()==null){
a = strA.indexOf(strB, FindStartPos);
}
else
{
a=strA.indexOf(strB,FindStartPos-findText.getText().length()+1);
}
}
if(a > -1) {
if(up.isSelected()){
editArea.setCaretPosition(a);
b = findText.getText().length();
editArea.select(a, a + b);
}
else if(down.isSelected()){
editArea.setCaretPosition(a);
b = findText.getText().length();
editArea.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 && editArea.getSelectedText() != null){
editArea.replaceSelection("");
replaceCount++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -