⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bookeditor.java

📁 本程序用Java描述了一个类似windows自带的记事本的功能
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
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 + -