📄 notepad.java
字号:
package code;
import java.io.*;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;
import java.awt.*;
import java.awt.event.*;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.*;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;
import javax.swing.text.BadLocationException;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;
import javax.swing.undo.UndoManager;
/**
* 这是一款拓展Windows XP系统自带记事本的程序,该程序除了支持Windows XP记事本的功能外,还提供了多种功能,令记事本不再单调!<br>
* 特色:<br>
* (1)支持windows xp自带记事本的所有功能!<br>
* (2)增强的文本字体功能,可以设置字体颜色以及字体背景颜色等等,并且提供预览,多姿多彩,让你的记事本不再单调!!!<br>
* (3)可以改变文本编辑框的背景颜色,愉悦心情!<br>
* (4)改善xp记事本,支持重做(Redo)功能,更加方便快捷! <br>
* (5)增加工具栏,更加方便快捷!<br>
* (6)增强的替换功能,可选替换方向,适应与所有替换情况!<br>
* (7)状态栏显示功能,带给你最方便快捷的使用提示和实时字数统计,更加容易操作和习惯!<br>
* (8)完善的字数统计功能,让你犹如在WORD上操作!<br>
* (9)完美兼容Windows XP记事本所有快捷键,完全不存在适应问题!<br>
* (10)再也不用担心个人做的记事本无法打印,页面设置和打印没问题!<br>
* (11)使用windows xp友好界面风格,摒弃JAVA程序的界面,更加习惯!<br>
* (12)程序更加精悍!
* <p>
* 任何问题,联系作者:许子彦 QQ:125177027 E-mail:micaroo@vip.qq.com
* <p>
*
* @author 许子彦<br>
* 厦门大学软件学院软件工程系06级<br>
* 学号:24320062204504
*
* @version 2.01
*
*/
public class notepad extends JFrame implements ActionListener, ItemListener,
WindowListener, MouseListener {
Container c = this.getContentPane();
File file = null;// 当前文件
JFileChooser filechooser = new JFileChooser();
String oldValue; // 存放编辑区原来的内容,用于比较文本是否有改动
JMenuBar bar = new JMenuBar();
// 颜色拾取器,设置背景颜色时调用
JColorChooser colorchooser = new JColorChooser();
// 初始化的字体颜色和字体背景颜色,并且存储更改后的颜色设置
Color forecolor = Color.BLACK, backcolor = Color.WHITE;
// 菜单栏
JMenu fileMenu = new JMenu("文件(F)");
JMenu editMenu = new JMenu("编辑(E)");
JMenu formatMenu = new JMenu("格式(O)");
JMenu viewMenu = new JMenu("查看(V)");
JMenu helpMenu = new JMenu("帮助(H)");
// 菜单选项
JMenuItem newItem = new JMenuItem("新建(N)");
JMenuItem openItem = new JMenuItem("打开(O)...");
JMenuItem saveItem = new JMenuItem("保存(S)");
JMenuItem saveasItem = new JMenuItem("另存为...");
JMenuItem uniformItem = new JMenuItem("页面设置(U)...");
JMenuItem printItem = new JMenuItem("打印(P)...");
JMenuItem exitItem = new JMenuItem("退出(X)");
JMenuItem undoItem = new JMenuItem("撤消(U)");
JMenuItem redoItem = new JMenuItem("重做(R)");
JMenuItem cutItem = new JMenuItem("剪切(T)");
JMenuItem copyItem = new JMenuItem("复制(C)");
JMenuItem pasteItem = new JMenuItem("粘贴(P)");
JMenuItem deleteItem = new JMenuItem("删除(L)");
JMenuItem searchItem = new JMenuItem("查找(F)...");
JMenuItem searchnextItem = new JMenuItem("查找下一个(N)...");
JMenuItem replaceItem = new JMenuItem("替换(R)...");
JMenuItem gotoItem = new JMenuItem("转到(G)");
JMenuItem seleteAllItem = new JMenuItem("全选(A)");
JMenuItem dateItem = new JMenuItem("时间/日期(D)");
JMenuItem fontItem = new JMenuItem("字体(E)...");
JMenuItem colorItem = new JMenuItem("颜色(H)...");
JMenuItem countItem = new JMenuItem("字数统计");
JMenuItem aboutItem = new JMenuItem("关于(A)");
// 右键菜单选项
JMenuItem undopopupItem = new JMenuItem("撤消CTRL+Z");
JMenuItem redopopupItem = new JMenuItem("重做CTRL+R");
JMenuItem cutpopupItem = new JMenuItem("剪切CTRL+X");
JMenuItem copypopupItem = new JMenuItem("复制CTRL+C");
JMenuItem pastepopupItem = new JMenuItem("粘贴CTRL+V");
JMenuItem deletepopupItem = new JMenuItem("删除Delete");
JMenuItem seleteAllpopupItem = new JMenuItem("全选CTRL+A");
JMenuItem fontpopupItem = new JMenuItem("字体...CTRL+F");
JMenuItem colorpopupItem = new JMenuItem("颜色...CTRL+I");
// 自动换行使用CheckBox
JCheckBoxMenuItem lineItem = new JCheckBoxMenuItem("自动换行(W)");
JCheckBoxMenuItem statueItem = new JCheckBoxMenuItem("状态栏");
// 工具栏图标
Icon newicon, openicon, saveicon, undoicon, redoicon, copyicon, pasteicon,
cuticon, deleteicon, fonticon, coloricon, helpicon;
// 工具栏的图标button
JButton newButton, openButton, saveButton, undoButton, redoButton,
copyButton, pasteButton, cutButton, deleteButton, fontButton,
colorButton, helpButton, fontcolorchooser, fontbackcolorchooser;
// 显示字体效果预览用的JLabel
JLabel fontPreviewLabel = new JLabel("预览");
// 记事本框
JTextPane text = new JTextPane();
// 撤销管理器,使用在撤销和重做功能
UndoManager undo;
// 记事本框滚动条
JScrollPane scroller = new JScrollPane(text);
// 字体设置所使用的ComboBox,分别是字体名称、字号大小、文字样式、文字颜色、文字背景颜色
private JList fontName = null, fontSize = null, fontStyle = null;
// 改变文字样式所使用的文本形式
private StyledDocument doc = null;
// 继承ActionListener的内部类对象
ActionHandler handler = new ActionHandler();
// 用于标志是否是新的文件
boolean newfileFlag = true;
// 调用打印机所需
PrinterJob prtMe = PrinterJob.getPrinterJob();
// 有右键,才方便
JPopupMenu popupMenu;
// 状态栏
JLabel statuelabel = new JLabel("状态栏");
public notepad() {
super("新建 文本文档");
//设置显示位置
Toolkit kt=this.getToolkit();
this.setLocation(kt.getScreenSize().width/2-180, kt.getScreenSize().height/2-180);
// 以假乱真呵呵,把JFrame左边的JAVA图标改成记事本的图标,这下更像是记事本了
setIconImage(Toolkit.getDefaultToolkit().createImage("image/标题.gif"));
// 获得JTextPane的Document
Font defaultFont = new Font("宋体", Font.PLAIN, 14);// 默认字体
text.setFont(defaultFont);
doc = text.getStyledDocument();
// 窗口事件监听器,点击关闭时使用
this.addWindowListener(this);
// 设置布局
c.setLayout(new BorderLayout());
// 设置菜单
setJMenuBar(bar);
// 撤销重做管理器,添加监听器
undo = new UndoManager();
text.getDocument().addUndoableEditListener(undo);
// 添加组件
bar.add(fileMenu);
fileMenu.setMnemonic('f');
fileMenu.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("文件菜单(ALT+F)");
}
});
bar.add(editMenu);
editMenu.setMnemonic('e');
editMenu.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("编辑菜单(ALT+E)");
}
});
bar.add(formatMenu);
formatMenu.setMnemonic('o');
formatMenu.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("格式菜单(ALT+O)");
}
});
bar.add(viewMenu);
viewMenu.setMnemonic('v');
viewMenu.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("查看菜单(ALT+V)");
}
});
bar.add(helpMenu);
helpMenu.setMnemonic('h');
helpMenu.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("帮助菜单(ALT+H)");
}
});
// 文件菜单组件
fileMenu.add(newItem);
newItem.setMnemonic('n');
newItem.setAccelerator(KeyStroke.getKeyStroke('N', Event.CTRL_MASK,
false));
newItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("新建(CTRL+N)");
}
});
newItem.addActionListener(this);
fileMenu.add(openItem);
openItem.setMnemonic('o');
openItem.setAccelerator(KeyStroke.getKeyStroke('O', Event.CTRL_MASK,
false));
openItem.addActionListener(this);
openItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("打开(CTRL+O)");
}
});
fileMenu.add(saveItem);
saveItem.setMnemonic('s');
saveItem.setAccelerator(KeyStroke.getKeyStroke('S', Event.CTRL_MASK,
false));
saveItem.addActionListener(this);
saveItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("保存(CTRL+S)");
}
});
fileMenu.add(saveasItem);
saveasItem.setMnemonic('A');
saveasItem.addActionListener(this);
saveasItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("另存为");
}
});
fileMenu.addSeparator();
fileMenu.add(uniformItem);
uniformItem.setMnemonic('U');
uniformItem.addActionListener(this);
uniformItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("页面设置");
}
});
fileMenu.add(printItem);
printItem.setMnemonic('P');
printItem.setAccelerator(KeyStroke.getKeyStroke('P', Event.CTRL_MASK,
false));
printItem.addActionListener(this);
printItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("打印(CTRL+P)");
}
});
fileMenu.addSeparator();
fileMenu.add(exitItem);
exitItem.setMnemonic('X');
exitItem.addActionListener(this);
exitItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("退出");
}
});
// 编辑菜单组件
editMenu.add(undoItem);
undoItem.setMnemonic('U');
undoItem.setAccelerator(KeyStroke.getKeyStroke('Z', Event.CTRL_MASK,
false));
undoItem.addActionListener(this);
undoItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("撤销(CTRL+Z)");
}
});
editMenu.add(redoItem);
redoItem.setMnemonic('R');
redoItem.setAccelerator(KeyStroke.getKeyStroke('R', Event.CTRL_MASK,
false));
redoItem.addActionListener(this);
redoItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("重做(CTRL+R)");
}
});
editMenu.addSeparator();
editMenu.add(cutItem);
cutItem.setMnemonic('T');
cutItem.setAccelerator(KeyStroke.getKeyStroke('X', Event.CTRL_MASK,
false));
cutItem.addActionListener(this);
cutItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("剪切(CTRL+X)");
}
});
editMenu.add(copyItem);
copyItem.setMnemonic('C');
copyItem.setAccelerator(KeyStroke.getKeyStroke('C', Event.CTRL_MASK,
false));
copyItem.addActionListener(this);
copyItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("复制(CTRL+C)");
}
});
editMenu.add(pasteItem);
pasteItem.setMnemonic('P');
pasteItem.setAccelerator(KeyStroke.getKeyStroke('V', Event.CTRL_MASK,
false));
pasteItem.addActionListener(this);
pasteItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("粘贴(CTRL+V)");
}
});
editMenu.add(deleteItem);
deleteItem.setMnemonic('L');
deleteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0,
false));
deleteItem.addActionListener(this);
deleteItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("删除(Delete)");
}
});
editMenu.addSeparator();
editMenu.add(searchItem);
searchItem.setMnemonic('F');
searchItem.setAccelerator(KeyStroke.getKeyStroke('F', Event.CTRL_MASK,
false));
searchItem.addActionListener(this);
searchItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("查找(CTRL+F)");
}
});
editMenu.add(searchnextItem);
searchnextItem.setMnemonic('N');
searchnextItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3, 0,
false));
searchnextItem.addActionListener(this);
searchnextItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("查找下一个(F3)");
}
});
editMenu.add(replaceItem);
replaceItem.setMnemonic('R');
replaceItem.setAccelerator(KeyStroke.getKeyStroke('H', Event.CTRL_MASK,
false));
replaceItem.addActionListener(this);
replaceItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("替换(CTRL+H)");
}
});
editMenu.add(gotoItem);
gotoItem.setMnemonic('G');
gotoItem.setAccelerator(KeyStroke.getKeyStroke('G', Event.CTRL_MASK,
false));
gotoItem.setEnabled(false);
gotoItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("转向(CTRL+G)");
}
});
editMenu.addSeparator();
editMenu.add(seleteAllItem);
seleteAllItem.setMnemonic('A');
seleteAllItem.setAccelerator(KeyStroke.getKeyStroke('A',
Event.CTRL_MASK, false));
seleteAllItem.addActionListener(this);
seleteAllItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("全选(CTRL+A)");
}
});
editMenu.add(dateItem);
dateItem.setMnemonic('D');
dateItem.setAccelerator(KeyStroke
.getKeyStroke(KeyEvent.VK_F5, 0, false));
dateItem.addActionListener(this);
dateItem.addMouseListener(new MouseAdapter() {
public void mouseEntered(MouseEvent e) {
statuelabel.setText("日期/时间(F5)");
}
});
// 格式菜单组件
formatMenu.add(fontItem);
fontItem.setMnemonic('E');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -