📄 notepad.java
字号:
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 + -