📄 05151858102.java
字号:
package JavaNotepad;
/**
* version 1.3
* author skey
* time 2007-07-02 15:12:00
* email skey_chen@163.com/skey_chen@126.com
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.UndoableEditEvent;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoManager;
public class notepad
{
public static void main(String[] args)
{
Frame frame = new JavaNotepad();
frame.setVisible(true);// 显示窗口
}
}
class JavaNotepad extends JFrame implements ActionListener, MouseListener, UndoableEditListener
{
// serialVersionUID序列化时为了保持版本的兼容性,即在版本升级时反序列化仍保持对象的唯一性。
private final static long serialVersionUID = 1L;
JFileChooser jfc = new JFileChooser();
JScrollPane sp;
JPanel jp;
UndoManager undoManger;// 定义出undo/ redo对象
// 用来判断文件内容是否改变,是否需要存盘
String s = "";// 打开文件时的内容
String stemp = "";// 关闭或新建窗体时当前的内容
int ifsave = -1;// 是否要保存,-1是不用,0是取消,1是要保存
// 用于本页面查找下一个
static String findnextstr = "";// 保存查找时用的字符串
static boolean findnextboolean = false;// 保存查找时是否区分大小写
static String findnextupdown = "down";// 保存查找时查找的方向
final JTextArea textarea = new JTextArea();
JMenuBar menubar = new JMenuBar();
// **************************************************************************
// 文件
JMenu filemenu = new JMenu("文件(F)");
JMenuItem newitem = new JMenuItem("新建(N)");
JMenuItem openitem = new JMenuItem("打开(O)...");
JMenuItem saveitem = new JMenuItem("保存(S)");
JMenuItem saveasitem = new JMenuItem("另存为(A)...");
JMenuItem exititem = new JMenuItem("退出(X)");
// 编辑
JMenu editmenu = new JMenu("编辑(E)");
JMenuItem redoitem = new JMenuItem("重做(Y)");
JMenuItem undoitem = new JMenuItem("撤销(Z)");
JMenuItem selectitem = new JMenuItem("全选(A)");
JMenuItem copyitem = new JMenuItem("复制(C)");
JMenuItem cutitem = new JMenuItem("剪切(T)");
JMenuItem pasteitem = new JMenuItem("粘贴(P)");
JMenuItem deleteitem = new JMenuItem("删除(L)");
JMenuItem finditem = new JMenuItem("查找(F)");
JMenuItem findnextitem = new JMenuItem("查找下一个(N)");
JMenuItem replaceitem = new JMenuItem("替换(R)");
// 格式
JMenu formatmenu = new JMenu("格式(O)");
JCheckBoxMenuItem autorowitem = new JCheckBoxMenuItem("自动换行");
JMenuItem fontitem = new JMenuItem("字体(F)");
JMenuItem coloritem = new JMenuItem("颜色(C)");
// 帮助
JMenu helpmenu = new JMenu("帮助(H)");
JMenuItem aboutitem = new JMenuItem("关于记事本");
// 快捷菜单
JPopupMenu jpm = new JPopupMenu();
JMenuItem predoitem = new JMenuItem("重做");
JMenuItem pundoitem = new JMenuItem("撤销");
JMenuItem pselectitem = new JMenuItem("全选");
JMenuItem pcopyitem = new JMenuItem("复制");
JMenuItem pcutitem = new JMenuItem("剪切");
JMenuItem ppasteitem = new JMenuItem("粘贴");
JMenuItem pdeleteitem = new JMenuItem("删除");
// **************************************************************************
public String filename = null;// 默认的文件名
Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();// 剪贴板对象
// 创建初始颜色为Color.BLACK的JColorChooser对象,为空则为白色
JColorChooser jColorChooser = new JColorChooser(Color.BLACK);
private FileDialog openfiledialog = new FileDialog(this, "打开文件", FileDialog.LOAD);
private FileDialog saveasfiledialog = new FileDialog(this, "保存", FileDialog.SAVE);
private FileDialog savefiledialog = new FileDialog(this, "是否保存", FileDialog.SAVE);
public JavaNotepad()
{
setTitle("JAVA 记事本");
// 初始化当前字体:字体为宋体,Font.PLAIN即常规,字体大小为18
setFont(new Font("宋体", Font.PLAIN, 18));
// setFont(new Font("Arial",Font.PLAIN,20));
// setSize(600,450);
this.setBounds(140, 105, 600, 450);
// 文件******************************************************************
filemenu.setMnemonic(KeyEvent.VK_F);// ALT+F键
// 新建 ---加CTRL+N组合键
newitem.setMnemonic(KeyEvent.VK_N);
KeyStroke keynew = KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK);
newitem.setAccelerator(keynew);
// 打开...---加CTRL+O组合键
openitem.setMnemonic(KeyEvent.VK_O);
openitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK));
// 保存 ---加CTRL+S组合键
saveitem.setMnemonic(KeyEvent.VK_S);
saveitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK));
// 保存 ---加ALT+S组合键
saveasitem.setMnemonic(KeyEvent.VK_A);
// 退出 ---加ALT+X组合键
exititem.setMnemonic(KeyEvent.VK_X);
// KeyStroke keyexit=KeyStroke.getKeyStroke(KeyEvent.VK_Q,Event.CTRL_MASK);
// exititem.setAccelerator(keyexit);
// 为"文件"添加子菜单
filemenu.add(newitem);
filemenu.add(openitem);
filemenu.addSeparator();
filemenu.add(saveitem);
filemenu.add(saveasitem);
filemenu.addSeparator();
filemenu.add(exititem);
// 编辑******************************************************************
editmenu.setMnemonic(KeyEvent.VK_E);// ALT+E键
// 重做 ---加CTRL+Y组合键
redoitem.setMnemonic(KeyEvent.VK_Y);
redoitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, Event.CTRL_MASK));
// 撤销 ---加CTRL+Z组合键
undoitem.setMnemonic(KeyEvent.VK_Z);
undoitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, Event.CTRL_MASK));
// 全选 ---加CTRL+A组合键
selectitem.setMnemonic(KeyEvent.VK_A);
selectitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, Event.CTRL_MASK));
// /下面三种情况java默认支持,不写也一样/////////////////////////////////
// 复制 ---加CTRL+C组合键
copyitem.setMnemonic(KeyEvent.VK_C);
copyitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, Event.CTRL_MASK));
// 剪切 ---加CTRL+X组合键
cutitem.setMnemonic(KeyEvent.VK_X);
cutitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, Event.CTRL_MASK));
// 粘贴 ---加CTRL+V组合键
pasteitem.setMnemonic(KeyEvent.VK_V);
pasteitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, Event.CTRL_MASK));
// //////////////////////////////////////////////////////////////////////
// 删除 ---加DELETE键
deleteitem.setMnemonic(KeyEvent.VK_DELETE);
deleteitem.setAccelerator(KeyStroke.getKeyStroke("DELETE"));
// 查找 ---加CTRL+F键
finditem.setMnemonic(KeyEvent.VK_F);
finditem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F, Event.CTRL_MASK));
// 查找下一个 ---加F3键
findnextitem.setMnemonic(KeyEvent.VK_F3);
findnextitem.setAccelerator(KeyStroke.getKeyStroke("F3"));
// 替换 ---加CTRL+R键
replaceitem.setMnemonic(KeyEvent.VK_R);
replaceitem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_R, Event.CTRL_MASK));
// 为"编辑"添加子菜单
editmenu.add(redoitem);
editmenu.add(undoitem);
editmenu.addSeparator();
editmenu.add(cutitem);
editmenu.add(copyitem);
editmenu.add(pasteitem);
editmenu.add(deleteitem);
editmenu.addSeparator();
editmenu.add(selectitem);
editmenu.addSeparator();
editmenu.add(finditem);
editmenu.add(findnextitem);
editmenu.add(replaceitem);
// 格式******************************************************************
formatmenu.setMnemonic(KeyEvent.VK_O);// ALT+O键
// 自动换行 ---加ALT+W组合键
autorowitem.setMnemonic(KeyEvent.VK_W);
// 字体 ---加ALT+F组合键
fontitem.setMnemonic(KeyEvent.VK_F);
// 字体颜色 ---加ALT+C组合键
coloritem.setMnemonic(KeyEvent.VK_C);
// 为"格式"添加子菜单
formatmenu.add(autorowitem);
formatmenu.addSeparator();
formatmenu.add(fontitem);
formatmenu.add(coloritem);
// 帮助******************************************************************
helpmenu.setMnemonic(KeyEvent.VK_H);// ALT+H键
// 帮助关于记事本 ---加ALT+H组合键
aboutitem.setMnemonic(KeyEvent.VK_H);
// 为"帮助"添加子菜单
helpmenu.add(aboutitem);
// ////******************************************************************
menubar.add(filemenu);
menubar.add(editmenu);
menubar.add(formatmenu);
menubar.add(helpmenu);
setJMenuBar(menubar);
// 滚动条****************************************************************
// 创建一个显示指定组件内容的 JScrollPane
// 只要组件的内容超过视图大小就会显示水平和垂直滚动条。
sp = new JScrollPane(textarea);
// getContentPane().add(textarea);
jp = new JPanel();
setContentPane(jp);
jp.setLayout(new BorderLayout());
jp.add(sp, BorderLayout.CENTER);
/**/
jpm.add(predoitem);
jpm.add(pundoitem);
jpm.addSeparator();
jpm.add(pcutitem);
jpm.add(pcopyitem);
jpm.add(ppasteitem);
jpm.add(pdeleteitem);
jpm.addSeparator();
jpm.add(pselectitem);
textarea.add(jpm);
textarea.addMouseListener(this);
textarea.setFont(new Font("宋体", Font.PLAIN, 18));
newitem.addActionListener(this);
openitem.addActionListener(this);
saveitem.addActionListener(this);
saveasitem.addActionListener(this);
exititem.addActionListener(this);
redoitem.addActionListener(this);
undoitem.addActionListener(this);
selectitem.addActionListener(this);
cutitem.addActionListener(this);
copyitem.addActionListener(this);
pasteitem.addActionListener(this);
deleteitem.addActionListener(this);
finditem.addActionListener(this);
findnextitem.addActionListener(this);
replaceitem.addActionListener(this);
predoitem.addActionListener(this);
pundoitem.addActionListener(this);
pcutitem.addActionListener(this);
pcopyitem.addActionListener(this);
ppasteitem.addActionListener(this);
pdeleteitem.addActionListener(this);
pselectitem.addActionListener(this);
autorowitem.addActionListener(this);
fontitem.addActionListener(this);
coloritem.addActionListener(this);
aboutitem.addActionListener(this);
// 设置撤消、重复对象实例
undoManger = new UndoManager();
// undoManger.setLimit(5);//设置只能撤消的步数
textarea.getDocument().addUndoableEditListener(this);
/* addWindowListener(new windows()); */
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
ifsave = tosave();
if (ifsave == 1)
{// 如果改变
saveasfiledialog.setVisible(true);
filename = saveasfiledialog.getDirectory() + saveasfiledialog.getFile();
// 没有选择文件
if ((savefiledialog.getDirectory() == null)
&& (savefiledialog.getFile() == null))
{
filename = null;
}
if (filename != null)
{
writeFile(filename);
System.exit(0);
}
}
else if (ifsave == -1)
{
System.exit(0);
}
else if (ifsave == 0)
{
}
}
});
}
// undo redo 判断是否可用
public void undoableEditHappened(UndoableEditEvent parm1)
{
undoManger.addEdit(parm1.getEdit());
}
public void actionPerformed(ActionEvent e)
{
Object EventS = e.getSource();
if (EventS == newitem)
{// 新建一个记事本
ifsave = this.tosave();
if (ifsave == 1)
{// 如果改变
savefiledialog.setVisible(true);
filename = savefiledialog.getDirectory() + savefiledialog.getFile();
// 没有选择文件
if ((savefiledialog.getDirectory() == null) && (savefiledialog.getFile() == null))
{
filename = null;
}
if (filename != null)
{
writeFile(filename);
s = "";// 保存后内容为清空
filename = null;
textarea.setText("");
this.setTitle("新建 JAVA 记事本");
return;
}
}
else if (ifsave == -1)
{
s = "";
filename = null;
textarea.setText("");
this.setTitle("新建 JAVA 记事本");
return;
}
else if (ifsave == 0)
{
}
}
else if (EventS == openitem)
{// 打开一个文件
String ss = filename;// 先保存当前文件名
stemp = textarea.getText();// 先用字符串保存当前内容
String ss0 = stemp;// 用字符串保存当前内容
ifsave = this.tosave();
if (ifsave == 1 || ifsave == -1)
{// 如果改变或者不保存
if (ifsave == 1)
{// 如果改变
savefiledialog.setVisible(true);
filename = savefiledialog.getDirectory() + savefiledialog.getFile();
if ((savefiledialog.getDirectory() == null)
&& (savefiledialog.getFile() == null))
{
// 没有选择文件
filename = null;
}
if (filename != null)
{
writeFile(filename);
s = stemp;// 保存后内容为保存时的内容
}
}
// 不管是否保存
openfiledialog.setVisible(true);
filename = openfiledialog.getDirectory() + openfiledialog.getFile();
// 没有选择文件
if ((openfiledialog.getDirectory() == null) && (openfiledialog.getFile() == null))
{
filename = null;
}
if (filename != null)
{
readFile(filename);
s = textarea.getText();
this.updates();
}
else
{
// 复原
filename = ss;
textarea.setText(ss0);
this.updates();
}
}
else if (ifsave == 0)
{// 取消
}
}
else if (EventS == saveitem)
{// 保存文件
if (filename != null)
{
writeFile(filename);
s = textarea.getText();// 保存后内容为保存时的内容
}
else
{
savefiledialog.setVisible(true);
filename = savefiledialog.getDirectory() + savefiledialog.getFile();
// 没有选择文件
if ((savefiledialog.getDirectory() == null) && (savefiledialog.getFile() == null))
{
filename = null;
}
if (filename != null)
{
writeFile(filename);
this.updates();
s = textarea.getText();// 保存后内容为保存时的内容
}
}
}
else if (EventS == saveasitem)
{// 另存为
String ss = filename;// 先保存当前文件名
saveasfiledialog.setVisible(true);
filename = saveasfiledialog.getDirectory() + saveasfiledialog.getFile();
// 没有选择文件
if ((saveasfiledialog.getDirectory() == null) && (saveasfiledialog.getFile() == null))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -