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

📄 notepad.java

📁 记事本
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.niit.NotaPad;

import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import javax.swing.filechooser.FileFilter;

import java.io.*;
import java.util.*;

public class NotePad {
	/*
	 * 本记事本说明: 1) 目前已经基本实现全部功能 2) 记事本代码1500行左右,6个java文件 3)
	 * 帮助查找中,因为存在着html页面连接,故没写事件
	 */
	public static void main(String[] args) {
		MenuFrame frame = new MenuFrame();
		frame.setVisible(true);
	}
}

class MenuFrame extends JFrame {
	private static final long serialVersionUID = 1L;

	private JTextArea content = new JTextArea();
	private Vector<String> v = new Vector<String>();
	private File file;
	private String content_first = "";
	private JCheckBoxMenuItem boxMenuR, fonts, viewL;
	private JLabel label;
	private JMenuItem[] component;// 用于存储所有的菜单
	private int j = 0;

	public MenuFrame() {
		setTitle("记事本");
		setLocation(133, 122);
		setSize(820, 750);
		file = new File("");
		component = new JMenuItem[30];
		JMenuBar mb = new JMenuBar();
		// ===============定义了JMenuBar中的菜单==================
		JMenu file = new JMenu("文件  (F) ");
		JMenu edit = new JMenu("编辑   (E)");
		JMenu geshi = new JMenu("格式  (O)");
		JMenu view = new JMenu("查看  (V)");
		JMenu help = new JMenu("帮助  (H)");
		// ===============文件菜单及其中菜单项==================
		mb.add(file);
		setMenu(file, 'F');
		setMenu(file, "新建(N)", 'N', KeyEvent.VK_N, InputEvent.CTRL_MASK,
				new NewHandle());
		setMenu(file, "打开(O)...", 'O', KeyEvent.VK_O, InputEvent.CTRL_MASK,
				new OpenHandle());
		setMenu(file, "保存(S)", 'S', KeyEvent.VK_S, InputEvent.CTRL_MASK,
				new SaveHandle());
		setMenu(file, "另存为(A)...", 'A', KeyEvent.VK_A, InputEvent.CTRL_MASK,
				new NewSaveHandle());
		file.addSeparator(); // 加分割线
		setMenu(file, "页面设置(U)...", 'U', new PrinterHandle());
		setMenu(file, "打印(P)...", 'P', KeyEvent.VK_P, InputEvent.CTRL_MASK,
				new FilePrtHandle());
		file.addSeparator(); // 加分割线
		setMenu(file, "退出(X)", 'Q', new QuitHandle());
		// ============编辑菜单及其中菜单项 ==================
		setMenu(edit, 'e');
		setMenu(edit, "撤销(U)", 'U', KeyEvent.VK_Z, InputEvent.CTRL_MASK,
				new BackHandle());
		edit.addSeparator(); // ==== 加分割线
		setMenu(edit, "剪贴(T)", 'T', KeyEvent.VK_X, InputEvent.CTRL_MASK,
				new CutHandle());
		setMenu(edit, "复制(C)", 'C', KeyEvent.VK_C, InputEvent.CTRL_MASK,
				new CopyHandle());
		setMenu(edit, "删除(L)", 'L', KeyEvent.VK_DELETE, 0, new DelHandle());
		edit.addSeparator();
		setMenu(edit, "粘贴(P)", 'P', KeyEvent.VK_V, InputEvent.CTRL_MASK,
				new TieHandle()); // ======== 加分割线
		setMenu(edit, "查找...(F)", 'F', KeyEvent.VK_F, InputEvent.CTRL_MASK,
				new SearchHandle());
		setMenu(edit, "查找下一个(N)", 'N', "F3", new SnextHandle());
		setMenu(edit, "替换(R)", 'R', KeyEvent.VK_H, InputEvent.CTRL_MASK,
				new ChangeHandle());
		setMenu(edit, "转到(G)", 'G', KeyEvent.VK_G, InputEvent.CTRL_MASK,
				new GotoHanle());
		edit.addSeparator(); // ========= 加分割线
		setMenu(edit, "全选(A)", 'A', KeyEvent.VK_A, InputEvent.CTRL_MASK,
				new SallHandle());
		setMenu(edit, "时间/日期(D)", 'D', "F5", new DateHandle());
		mb.add(edit);
		// =============格式菜单及其中菜单项===============
		setMenu(geshi, 'O');
		setMenu(geshi, fonts, "自动换行(W)", 'W', new FontsHandle());
		content.setLineWrap(true);
		setMenu(geshi, "字体(F)", 'F', new FontHandle());
		mb.add(geshi);
		// =============查看菜单及其中菜单项===========
		setMenu(view, 'V');
		setMenu(view, viewL, "状态栏(S)", 'S', new ViewHandle());
		mb.add(view);
		// ================ 帮助菜单及其中菜单项======
		setMenu(help, 'H');
		setMenu(help, "帮助主题(H)", 'T', new HelpHandle());
		help.addSeparator(); // 加分割线
		setMenu(help, "关于记事本(A)", 'A', new HalpInfHandle());
		mb.add(help);
		setJMenuBar(mb);
		// =========弹出式菜单,即右键菜单============
		final JPopupMenu popup = new JPopupMenu();
		setMenu(popup, "  撤销(U)", 'U', KeyEvent.VK_Z, InputEvent.CTRL_MASK,
				new BackHandle());
		edit.addSeparator(); // ==== 加分割线
		setMenu(popup, "  剪贴(T)", 'T', KeyEvent.VK_X, InputEvent.CTRL_MASK,
				new CutHandle());
		setMenu(popup, "  复制(C)", 'C', KeyEvent.VK_C, InputEvent.CTRL_MASK,
				new CopyHandle());
		setMenu(popup, "  删除(L)", 'L', KeyEvent.VK_DELETE, 0, new DelHandle());
		setMenu(popup, "  粘贴(P)", 'P', KeyEvent.VK_V, InputEvent.CTRL_MASK,
				new TieHandle());
		popup.addSeparator(); // ======== 加分割线
		setMenu(popup, "  全选(A)", 'A', KeyEvent.VK_A, InputEvent.CTRL_MASK,
				new SallHandle());
		setMenu(popup, boxMenuR, "从右到左的阅读顺序(R)", 'R', new BoxRHandle());
		// setMenu(popup, boxMenuS, "显示Unicode控制字符(S)", 'S', new BoxSHandle());
		// =============二级菜单(子菜单)==========
		JMenu secondMenu = new JMenu("插入Unicode控制字符(I)");
		setMenu(secondMenu, 'I');
		popup.add(secondMenu);
		secondMenu.add(new JMenuItem("LRM left-to-right"));
		component[18].setSelected(true);
		JScrollPane spane = new JScrollPane(content);
		spane
				.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		spane
				.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		add(spane, BorderLayout.CENTER);
		label = new JLabel("", 4);
		label.setVisible(false);
		add(label, BorderLayout.SOUTH);

		// =========文本监听,是否要弹出右键窗口================
		content.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent e) {
				if (e.isPopupTrigger()) {
					popup.show(e.getComponent(), e.getX(), e.getY());
				}
			}
		});
		// 光标状态的监听,以便显示状态栏
		content.addCaretListener(new CaretListener() {
			public void caretUpdate(CaretEvent e) {

				int i = 0, j = 1;
				String area = content.getText();
				// ====先定义一个字符数组存储area 每一个字符
				char[] cs = area.toCharArray();
				for (int i1 = 0; i1 < e.getDot(); i1++) {
					// ====10表示一个回车符==
					if (10 == (cs[i1] + 0)) {
						i++;
						j = i1;
					}
				}
				if (i == 0) {
					label.setText("第" + (i + 1) + "行  " + "第"
							+ (e.getDot() + 1) + "列");
				} else {
					label.setText("第" + (i + 1) + "行  " + "第"
							+ (e.getDot() - j) + "列");
				}
			}
		});
		// ==============判断菜单是否显示可用,及撤销中存储要撤销的内容================
		Timer timer = new Timer(5, new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				// 存储用户改变的信息,并记录下来,以便当执行撤销操作时可用
				if (v.isEmpty()) {
					v.add(content.getText());
				} else {
					if (!v.lastElement().equals(content.getText())) {
						v.add(content.getText());
					}
				}
				// 判断撤销是否可用,条件是,用户是否有所操作
				if ((content.getText()).equals(content_first)) {
					component[7].setEnabled(false);
					component[23].setEnabled(false);
				} else {
					component[7].setEnabled(true);
					component[23].setEnabled(true);
				}
				// 判断查询是否可用,条件是文本是否为空
				if ((content.getText()).equals("")) {
					component[12].setEnabled(false);
					component[13].setEnabled(false);
				} else {
					component[12].setEnabled(true);
					component[13].setEnabled(true);
				}
				// 判断剪切,复制,删除等是否可用,条件是是否有被选定内容
				if (content.getSelectedText() != null) {
					int t = 8, m = 11;
					for (int i = 0; i < 2; i++) {
						for (; t < m; t++) {
							component[t].setEnabled(true);
						}
						t = 24;
						m = 27;
					}
				} else {
					int t = 8, m = 11;
					for (int i = 0; i < 2; i++) {
						for (; t < m; t++) {
							component[t].setEnabled(false);
						}
						t = 24;
						m = 27;
					}
				}
				// 状态栏,转到,是否可用,判断条件是自动换行是否被选中
				if (component[18].isSelected()) {
					component[15].setEnabled(false);
					component[20].setEnabled(false);
				} else {
					component[15].setEnabled(true);
					component[20].setEnabled(true);
				}
			}

		});
		timer.start();
		// ===========关闭窗口事件================
		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				final String s = content.getText();
				if (s.equals(content_first)) {
					System.exit(0);
				} else {
					final int i = JOptionPane.showConfirmDialog(MenuFrame.this,
							"文件 内容已经改变是否需要保存再退出?", "记事本",
							JOptionPane.YES_NO_OPTION,
							JOptionPane.QUESTION_MESSAGE);
					if (i == 1) {
						System.exit(0);
					}
					if (i == 0) {
						(new SaveHandle()).actionPerformed(e);
					}
					if (i == -1 || i == 2) {
					}
				}
			}

		});
	}

	// ==============初始化菜单项==============
	private void setMenu(JMenuItem j, char c) {
		j.setMnemonic(c);
	}

	// ==============重载了setMenu方法==============

	private void setMenu(JComponent m, JCheckBoxMenuItem item, String name,
			char c, ActionListener listener) {
		item = new JCheckBoxMenuItem(name);
		item.setMnemonic(c);
		item.addActionListener(listener);
		m.add(item);
		component[j] = item;
		j++;
	}

	// ==============重载了setMenu方法==============
	private void setMenu(JComponent m, String name, char c,
			ActionListener listener) {
		JMenuItem menuItem = new JMenuItem(name);
		menuItem.setMnemonic(c);
		menuItem.addActionListener(listener);
		m.add(menuItem);
		component[j] = menuItem;
		j++;
	}

	// ==============重载了setMenu方法==============
	private void setMenu(JComponent m, String name, char c, String s,
			ActionListener listener) {
		JMenuItem menuItem = new JMenuItem(name);
		menuItem.setMnemonic(c);
		menuItem.setAccelerator(KeyStroke.getKeyStroke(s));
		menuItem.addActionListener(listener);
		m.add(menuItem);
		component[j] = menuItem;
		j++;
	}

	// ==============重载了setMenu方法==============
	private void setMenu(JComponent m, String name, char c, int num, int word,
			ActionListener listener) {
		JMenuItem menuItem = new JMenuItem(name);
		menuItem.setMnemonic(c);
		menuItem.setAccelerator(KeyStroke.getKeyStroke(num, word));
		menuItem.addActionListener(listener);
		m.add(menuItem);
		component[j] = menuItem;
		j++;
	}

	/*
	 * 新建记事本动作,注意是否发现状态改变,用i判断用户的选择
	 */
	class NewHandle implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			String s = content.getText();
			if (s.equals(content_first)) {
				content.setText("");
			} else {
				int i = JOptionPane.showConfirmDialog(MenuFrame.this, "文件"
						+ file.getPath() + "内容已经改变是否需要保存再新建记事本?", "记事本",
						JOptionPane.YES_NO_CANCEL_OPTION,
						JOptionPane.QUESTION_MESSAGE);
				if (i == 1) {
					content.setText("");
				}
				if (i == 0) {
					(new SaveHandle()).actionPerformed(e);
					content.setText("");
				}
			}
			file = new File("");
			content_first = content.getText();
			v.clear();
			MenuFrame.this.setTitle("新建文本文件-记事本");
		}
	}

	/*
	 * ==============保存记事本动作=========
	 */
	class SaveHandle implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			if (file.getName().length() == 0) {
				JFileChooser fileSave = new JFileChooser();
				fileSave.setCurrentDirectory(new File("d:/"));
				int result = fileSave.showSaveDialog(fileSave);
				if (result == JFileChooser.APPROVE_OPTION) {
					File fileName = fileSave.getSelectedFile();
					try {
						FileWriter in = new FileWriter(fileName);
						String fstr = content.getText();
						in.write(fstr);
						in.close();
					} catch (Exception ee) {

					}
					file = fileSave.getSelectedFile();
					MenuFrame.this.setTitle(file.getName());
				}
			} else {
				try {
					FileWriter in = new FileWriter(file);
					String fstr = content.getText();
					in.write(fstr);
					in.close();
				} catch (Exception ee) {
				}
			}
			content_first = content.getText();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -