📄 bookeditor.java
字号:
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import javax.swing.undo.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.datatransfer.*;
public class Bookeditor extends JFrame implements ActionListener{
private static final long serialVersionUID = 3617859655330969141L; //警告提示后加进去的,但不知道有什么用
/****************************************菜单项************************************/
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_Search, mEdit_Turnto, mEdit_SelectAll;
/****************************************格式菜单************************************/
JCheckBoxMenuItem formatMenu_LineWrap;
JMenuItem formatMenu_Font, formatMenu_Color_FgColor, formatMenu_Color_BgColor;
/****************************************查看菜单************************************/
JCheckBoxMenuItem viewMenu_Status;
/****************************************帮助菜单************************************/
JMenuItem mHelp_HelpTopics, mHelp_About;
/****************************************右键弹出菜单项****************************/
JPopupMenu rightclickMenu;
JMenuItem rightclickMenu_Undo, rightclickMenu_Cut, rightclickMenu_Copy, rightclickMenu_Paste,
rightclickMenu_Delete, rightclickMenu_SelectAll,rightclickMenu_Color_FgColor,
rightclickMenu_Color_BgColor,rightclickMenu_Font;
static JTextArea Text; // 文本编辑区域
JLabel statusLabel; // 状态栏标签(因为水平不行此栏过于简陋请见谅)
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);
File saveFileName = null, fileName = null;
public Bookeditor() {
super("记事本");
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
Container container = getContentPane();
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); // 添加负责通知任何更改的撤消侦听器
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'); //添加快捷键"alt"+相应的字母
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_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_New.addActionListener(this); // 注册事件监听
mFile_Open.addActionListener(this);
mFile_Save.addActionListener(this);
mFile_ASave.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_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_Search = new JMenuItem("查找与替换(F)", 'F');
mEdit_Turnto = new JMenuItem("跳转到(G)", 'G');
mEdit_SelectAll = new JMenuItem("全选(A)", 'A');
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_Search.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0));
mEdit_Turnto.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_G, InputEvent.CTRL_MASK));
mEdit_SelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, InputEvent.CTRL_MASK));
mEdit_Undo.addActionListener(this); // 注册事件监听
mEdit_Cut.addActionListener(this);
mEdit_Copy.addActionListener(this);
mEdit_Paste.addActionListener(this);
mEdit_Search.addActionListener(this);
mEdit_Turnto.addActionListener(this);
mEdit_SelectAll.addActionListener(this);
mEdit.add(mEdit_Undo); // 添加菜单项
mEdit.addSeparator(); // 添加分割线
mEdit.add(mEdit_Cut);
mEdit.add(mEdit_Copy);
mEdit.add(mEdit_Paste);
mEdit.addSeparator();
mEdit.add(mEdit_Search);
mEdit.add(mEdit_Turnto);
mEdit.addSeparator();
mEdit.add(mEdit_SelectAll);
// --------------格式菜单
formatMenu_LineWrap = new JCheckBoxMenuItem("自动换行(W)");
formatMenu_LineWrap.setMnemonic('W');
formatMenu_LineWrap.setState(true);
formatMenu_Font = new JMenuItem("字体(F)", 'F');
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_FgColor);//在颜色菜单中添加字体和背景两类选择
mMode.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.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, 0));
mHelp_HelpTopics.addActionListener(this);
mHelp_About.addActionListener(this);
mHelp.add(mHelp_HelpTopics);
mHelp.add(mHelp_About);
// -------------------创建右键弹出菜单
rightclickMenu = new JPopupMenu();
rightclickMenu_Undo = new JMenuItem("撤消(U)", 'U');
rightclickMenu_Cut = new JMenuItem("剪切(T)", 'T');
rightclickMenu_Copy = new JMenuItem("复制(C)", 'C');
rightclickMenu_Paste = new JMenuItem("粘贴(P)", 'P');
rightclickMenu_SelectAll = new JMenuItem("全选(A)", 'A');
rightclickMenu_Color_FgColor = new JMenuItem("字体颜色");
rightclickMenu_Color_BgColor = new JMenuItem("背景颜色");
rightclickMenu_Font = new JMenuItem("字体(F)", 'F');
rightclickMenu_Undo.setEnabled(false); // 撤消选项初始设为不可用
// ---------------向右键菜单添加菜单项和分隔符
rightclickMenu.add(rightclickMenu_Undo);
rightclickMenu.addSeparator();
rightclickMenu.add(rightclickMenu_Cut);
rightclickMenu.add(rightclickMenu_Copy);
rightclickMenu.add(rightclickMenu_Paste);
rightclickMenu.addSeparator();
rightclickMenu.add(rightclickMenu_SelectAll);
rightclickMenu.addSeparator();
rightclickMenu.add(rightclickMenu_Color_FgColor);
rightclickMenu.add(rightclickMenu_Color_BgColor);
rightclickMenu.add(rightclickMenu_Font);
// --------------------右键菜单注册事件
rightclickMenu_Undo.addActionListener(this);
rightclickMenu_Cut.addActionListener(this);
rightclickMenu_Copy.addActionListener(this);
rightclickMenu_Paste.addActionListener(this);
rightclickMenu_SelectAll.addActionListener(this);
rightclickMenu_Color_FgColor.addActionListener(this);
rightclickMenu_Color_BgColor.addActionListener(this);
rightclickMenu_Font.addActionListener(this);
// --------------------文本编辑区注册右键菜单事件
Text.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) { //在不同系统上弹出菜单的触发方式不同
checkForTriggerEvent(e); //因此为了正确实现跨平台功能
} //在 mouseReleased和mousePressed中都检查了isPopupTrigger
public void mouseReleased(MouseEvent e) {
checkForTriggerEvent(e);
}
private void checkForTriggerEvent(MouseEvent e) {
if (e.isPopupTrigger()) //判断此鼠标事件是否为该平台的弹出菜单触发事件
rightclickMenu.show(e.getComponent(), e.getX(), e.getY());// 在组件调用者的坐标空间中的位置
// X、Y
// 显示弹出菜单。
checkMenuItemEnabled(); // 调用方法设置剪切、复制、粘贴等功能的可用性
Text.requestFocus(); // 编辑区获取焦点
}
});
// -----------------------------------创建和添加状态栏
statusBar = new JToolBar();
statusBar.setLayout(new FlowLayout(FlowLayout.LEFT));
statusLabel = new JLabel("按F1获取帮助 ");
statusBar.add(statusLabel);
statusBar.addSeparator();
statusBar.addSeparator();
container.add(statusBar, BorderLayout.SOUTH);
statusBar.setVisible(true);
this.setJMenuBar(MenuBar); // 向窗口添加菜单条
container.add(scroll, BorderLayout.CENTER); // 向容器添加文本编辑区
this.setSize(800, 600);
this.setVisible(true);
checkMenuItemEnabled(); // 调用方法设置剪切、复制、粘贴等功能的可用性
Text.requestFocus();
this.addWindowListener(new WindowAdapter() { //设置关闭窗口的事件响应
public void windowClosing(WindowEvent evt) {
checkText(); //关闭时调用判断类
}
});
}
public void checkText() { //判断类,关闭程序时判断文件是否保存
Text.requestFocus();
if (!Text.getText().equals(oldValue)) {
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) {
statusLabel.setText("您没有选择任何文件");
return;
}
saveFileName = fileChooser.getSelectedFile();
if (saveFileName == null || saveFileName.getName().equals(""))
JOptionPane.showMessageDialog(this, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
else {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -