记事本小程序简介
这是个很小巧的记事本小程序,使用Java程序实现。它能实现最基本的文件打开、编辑、保存、另存为等功能,另外它附带快捷键操作功能以及鼠标右键菜单功能。
运行效果图如下:
源码
NotePadApp
package lyc.soft.notepad;
/**
* 记事本APP
*/
public class NotePadApp {
/**
* main函数
* @param args 入参
*/
public static void main(String[] args) {
NotePad.newNotePad("记事本");
}
}
NotePadCommon
package lyc.soft.notepad;
/**
* 记事本公共参数
*/
public interface NotePadCommon {
/**
* 文件菜单
*/
interface FileMenu{
String FILE = "文件";
String FILE_OPEN = "打开";
String FILE_SAVE = "保存";
String FILE_SAVE_AS = "另存为";
String FILE_CLOSE = "关闭";
}
/**
* 编辑菜单
*/
interface EditMenu{
String EDIT = "编辑";
String EDIT_CUT = "剪切";
String EDIT_COPY = "复制";
String EDIT_PASTE = "粘贴";
}
/**
* 关于菜单
*/
interface AboutMenu{
String ABOUT = "关于";
String ABOUT_NOTEPAD = "关于NotePad";
}
/**
* 提示信息
*/
interface Message{
String UN_CHANGE = "未修改";
String CHANGE = "已修改";
String IF_SAVE = "保存文件?";
String CHANGE_IF_SAVE = "文件已修改,是否保存?";
}
/**
* 开发者信息
*/
interface About{
String ABOUT = "程序名称:\n" +
" NotePad\n" +
"\n" +
"程序设计:\n" +
" 可以实现简单的文本编辑操作,例如:打开、保存、\n" +
"剪切、复制、粘贴等操作。\n" +
"\n" +
"简介:\n" +
" 这是一个简单的文本编辑器,同时也欢迎大家的下载\n" +
"与交流,本人的联系方式(qq):1078689276";
String TITLE = "关于NotePad";
}
}
NotePad
package lyc.soft.notepad;
import javax.swing.*;
/**
* 记事本
*/
public class NotePad extends JFrame {
/**
* 创建记事本程序
* @param title 记事本标题
* @return NotePad
*/
public static NotePad newNotePad(String title){
// 创建记事本对象
return new NotePad(title);
}
/**
* 记事本构造函数
* @param title 记事本标题
*/
public NotePad(String title) {
// 记事本标题
super(title);
// 初始化IU界面
NotePadUI notePadUI = NotePadUI.newNotePadUI().initUI();
// 绑定组件监听事件
NotePadListener.newNotePadListener().initActionListener(notePadUI);
}
}
NotePadListener
package lyc.soft.notepad;
import javax.swing.*;
import java.awt.event.*;
/**
* 记事本绑定监听事件
*/
public class NotePadListener {
// 记事本服务
NotePadService service = NotePadService.newNotePadService();
/**
* 创建NotePadListener对象
* @return NotePadListener
*/
public static NotePadListener newNotePadListener() {
// 创建记事本监听
return new NotePadListener();
}
/**
* 初始化NotePadListener对象
* @param notePadUI 记事本UI模块
*/
public void initActionListener(NotePadUI notePadUI) {
//给【文件】菜单设置快捷键
notePadUI.menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_MASK));
notePadUI.menuSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
notePadUI.menuClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, InputEvent.CTRL_MASK));
//给【编辑】菜单设置快捷键
notePadUI.menuCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK));
notePadUI.menuCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK));
notePadUI.menuPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK));
//给【关于】菜单设置快捷键
notePadUI.menuAbout.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_B, InputEvent.CTRL_MASK));
//系统关闭
notePadUI.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
service.close(notePadUI);
}
});
//菜单-打开
notePadUI.menuOpen.addActionListener(e -> service.open(notePadUI));
//菜单-保存
notePadUI.menuSave.addActionListener(e -> service.save(notePadUI));
//菜单-另存为
notePadUI.menuSaveAs.addActionListener(e -> service.saveAs(notePadUI));
//菜单-关闭
notePadUI.menuClose.addActionListener(e -> service.close(notePadUI));
//菜单-复制
notePadUI.menuCopy.addActionListener(e -> service.copy(notePadUI));
//菜单-剪切
notePadUI.menuCut.addActionListener(e -> service.cut(notePadUI));
//菜单-粘贴
notePadUI.menuPaste.addActionListener(e -> service.paste(notePadUI));
//菜单-关于NotePad
notePadUI.menuAbout.addActionListener(e -> service.about());
//编辑区鼠标相应事件
notePadUI.jTextArea.addMouseListener(new MouseAdapter() {
public void mouseReleased(MouseEvent e) {
//鼠标点击右键时弹出菜单栏
if (e.getButton() == MouseEvent.BUTTON3) {
notePadUI.popupMenu.show(notePadUI.editMenu, e.getX(), e.getY());
}
//鼠标点击左键时回收菜单栏
if (e.getButton() == MouseEvent.BUTTON1) {
notePadUI.popupMenu.setVisible(false);
}
}
});
//编辑区键盘响应事件
notePadUI.jTextArea.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
service.keyListener(notePadUI);
}
});
}
}
NotePadService
package lyc.soft.notepad;
import javax.swing.*;
import java.io.*;
import java.util.Scanner;
/**
* 记事本Service
*/
public class NotePadService{
// 文件
File file = null;
// 状态栏
int option = 0;
// 文本缓存
private StringBuffer temp = new StringBuffer();
// 输入缓存
private BufferedWriter bufferedWriter = null;
/**
* 创建记事本服务对象
* @return NotePadService
*/
public static NotePadService newNotePadService(){
return new NotePadService();
}
/**
* 关闭
* @param notePadUI 记事本UI模块
*/
public void close(NotePadUI notePadUI) {
if (!status(notePadUI)) {
System.exit(0);
} else {
// 如果文件不为空,则直接保存
if(file != null){
write(notePadUI);
} else {
// 由用户确认是否保存
saveConfirmDialog(notePadUI);
}
}
}
/**
* 由用户确认是否保存
* @param notePadUI 记事本UI模块
*/
private void saveConfirmDialog(NotePadUI notePadUI) {
option = JOptionPane.showConfirmDialog(null, NotePadCommon.Message.CHANGE_IF_SAVE, NotePadCommon.Message.IF_SAVE, JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE);
if (option == JOptionPane.YES_OPTION) {
saveAs(notePadUI);
} else if (option == JOptionPane.NO_OPTION) {
notePadUI.dispose();
}
}
/**
* 打开
* @param notePadUI 记事本UI模块
*/
public void open(NotePadUI notePadUI) {
option = notePadUI.fileChooser.showOpenDialog(null);
if (option == JFileChooser.APPROVE_OPTION) {
file = notePadUI.fileChooser.getSelectedFile();
} else if (option == JFileChooser.CANCEL_OPTION) {
}
if (file != null) {
try {
Scanner scan = new Scanner(new FileInputStream(file));
scan.useDelimiter("\n");
while (scan.hasNext()) {
notePadUI.jTextArea.append(scan.next());
notePadUI.jTextArea.append("\n");
}
// 缓存文本
temp.append(notePadUI.jTextArea.getText());
// 将本页面更改为未修改
notePadUI.jLabel.setText(NotePadCommon.Message.UN_CHANGE);
scan.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 保存方法
* @param notePadUI 记事本UI模块
*/
public void write(NotePadUI notePadUI){
try {
bufferedWriter = new BufferedWriter(new FileWriter(file));
bufferedWriter.write(notePadUI.jTextArea.getText());
bufferedWriter.close();
// 将文本区域标记成未修改。
notePadUI.jLabel.setText(NotePadCommon.Message.UN_CHANGE);
// 删除信息
temp.setLength(0);
// 重置信息
temp.append(notePadUI.jTextArea.getText());
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 另存为
* @param notePadUI 记事本UI模块
*/
public void saveAs(NotePadUI notePadUI) {
option = notePadUI.fileChooser.showSaveDialog(null);
if (option == JFileChooser.APPROVE_OPTION) {
file = notePadUI.fileChooser.getSelectedFile();
} else if (option == JFileChooser.CANCEL_OPTION) {
}
if (file != null) {
try {
PrintStream out = new PrintStream(new FileOutputStream(file));
out.print(notePadUI.jTextArea.getText());
out.close();
notePadUI.jLabel.setText(NotePadCommon.Message.UN_CHANGE);
// 删除信息
temp.setLength(0);
// 重置信息
temp.append(notePadUI.jTextArea.getText());
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 保存
* @param notePadUI 记事本UI模块
*/
public void save(NotePadUI notePadUI) {
if(status(notePadUI)){ // 已编辑,才执行,未编辑就不做任何操作
// 如果文件不存在,则跳出文件另存为窗口
if (file == null || !file.exists()) {
saveAs(notePadUI);
} else {
// 保存
write(notePadUI);
}
}
}
/**
* 复制
* @param notePadUI 记事本UI模块
*/
public void copy(NotePadUI notePadUI) {
notePadUI.jTextArea.copy();
notePadUI.popupMenu.setVisible(false);
}
/**
* 剪切
* @param notePadUI 记事本UI模块
*/
public void cut(NotePadUI notePadUI) {
notePadUI.jTextArea.cut();
notePadUI.jLabel.setText(NotePadCommon.Message.CHANGE);
notePadUI.popupMenu.setVisible(false);
}
/**
* 复制
* @param notePadUI 记事本UI模块
*/
public void paste(NotePadUI notePadUI) {
notePadUI.jTextArea.paste();
notePadUI.jLabel.setText(NotePadCommon.Message.CHANGE);
notePadUI.popupMenu.setVisible(false);
}
/**
* 开发者信息
*/
public void about() {
JOptionPane.showMessageDialog(null,
NotePadCommon.About.ABOUT, NotePadCommon.About.TITLE,
JOptionPane.INFORMATION_MESSAGE);
}
/**
* 文本域键盘监听
* @param notePadUI 记事本UI模块
*/
public void keyListener(NotePadUI notePadUI) {
// 判断文本域中信息是否与缓存相同,如果不相同,说明已修改
if(!notePadUI.jTextArea.getText().equals(temp.toString())){
notePadUI.jLabel.setText(NotePadCommon.Message.CHANGE);
}
}
/**
* 判断文本是否已修改
* @param notePadUI 记事本UI模块
* @return boolean 未修改,返回true;已修改,返回true
*/
public boolean status(NotePadUI notePadUI) {
if (notePadUI.jLabel.getText().equals(NotePadCommon.Message.UN_CHANGE)) {
return false;
} else {
return true;
}
}
}
NotePadUI
package lyc.soft.notepad;
import javax.swing.*;
import java.awt.*;
/**
* 记事本UI界面
*/
public class NotePadUI extends JFrame {
// 文本域面板
JPanel jPanel = null;
// 菜单栏面板
JPanel menuPane = null;
// 状态栏面板
JPanel statePane = null;
// 文本域
JTextArea jTextArea;
// 带滚动条的面板
JScrollPane jScrollPane;
// 状态栏标签
JLabel jLabel;
// 菜单栏
JMenuBar menuBar;
// 文件按钮
JMenu fileMenu;
// 编辑按钮
JMenu editMenu;
// 开发者信息按钮
JMenu aboutMenu;
// 打开
JMenuItem menuOpen;
// 保存
JMenuItem menuSave;
// 另存为
JMenuItem menuSaveAs;
// 关闭
JMenuItem menuClose;
// 复制
JMenuItem menuCopy;
// 剪切
JMenuItem menuCut;
// 粘贴
JMenuItem menuPaste;
// 开发者信息
JMenuItem menuAbout;
// 弹窗
JPopupMenu popupMenu;
// 文件选择
JFileChooser fileChooser = new JFileChooser();
// 创建NotePadUI界面对象
/**
* 创建记事本UI对象
* @return NotePadUI
*/
public static NotePadUI newNotePadUI() {
return new NotePadUI();
}
/**
* 初始化用户界面
* @return NotePadUI
*/
public NotePadUI initUI() {
setContentPane(getJPanel());
setBounds(100, 100, 700, 400);
setVisible(true);
return this;
}
/**
* 实例化文本域面板
* @return JPanel
*/
private JPanel getJPanel() {
if (jPanel == null) {
jPanel = new JPanel();
jPanel.setLayout(new BorderLayout());
jTextArea = new JTextArea();
jTextArea.setFont(new Font("宋体", Font.PLAIN, 16));
jTextArea.setLineWrap(true);
jScrollPane = new JScrollPane(jTextArea, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
jPanel.add(jScrollPane, BorderLayout.CENTER);
jPanel.add(getMenuPane(), BorderLayout.NORTH);
jPanel.add(getStatePane(), BorderLayout.SOUTH);
}
return jPanel;
}
/**
* 实例化菜单栏面板
* @return JPanel
*/
private JPanel getMenuPane() {
if (menuPane == null) {
menuPane = new JPanel();
menuPane.setLayout(new FlowLayout(3));
//菜单栏
menuBar = new JMenuBar();
//设置【文件】菜单
fileMenu = new JMenu(NotePadCommon.FileMenu.FILE);
menuOpen = new JMenuItem(NotePadCommon.FileMenu.FILE_OPEN);
menuSave = new JMenuItem(NotePadCommon.FileMenu.FILE_SAVE);
menuSaveAs = new JMenuItem(NotePadCommon.FileMenu.FILE_SAVE_AS);
menuClose = new JMenuItem(NotePadCommon.FileMenu.FILE_CLOSE);
fileMenu.add(menuOpen);
fileMenu.add(menuSave);
fileMenu.add(menuSaveAs);
fileMenu.add(menuClose);
//设置编辑菜单
editMenu = new JMenu(NotePadCommon.EditMenu.EDIT);
menuCut = new JMenuItem(NotePadCommon.EditMenu.EDIT_CUT);
menuCopy = new JMenuItem(NotePadCommon.EditMenu.EDIT_COPY);
menuPaste = new JMenuItem(NotePadCommon.EditMenu.EDIT_PASTE);
editMenu.add(menuCopy);
editMenu.add(menuCut);
editMenu.add(menuPaste);
//设置【关于】菜单
aboutMenu = new JMenu(NotePadCommon.AboutMenu.ABOUT);
menuAbout = new JMenuItem(NotePadCommon.AboutMenu.ABOUT_NOTEPAD);
aboutMenu.add(menuAbout);
//给menuBar添加菜单组件
menuBar.add(fileMenu);
menuBar.add(editMenu);
menuBar.add(aboutMenu);
//将menuBar添加到menuPane()面板中
menuPane.add(menuBar);
//设置弹出式菜单
popupMenu = new JPopupMenu();
popupMenu = editMenu.getPopupMenu();
}
return menuPane;
}
/**
* 实例化状态栏面板
* @return JPanel
*/
private JPanel getStatePane() {
if (statePane == null) {
statePane = new JPanel();
statePane.setLayout(new FlowLayout(3));
jLabel = new JLabel(NotePadCommon.Message.UN_CHANGE);
statePane.add(jLabel);
}
return statePane;
}
}