用Java代码写一个记事本小程序(java实现简单记事本完整代码)
chargingw 2024-09-08 02:49 8 浏览
记事本小程序简介
这是个很小巧的记事本小程序,使用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;
}
}
相关推荐
- Compose基础-Side-effect(二)(compose in)
-
1.前言在Compose基础-Side-effect(一)中,我们学习了几个常用的Side-effect:LaunchedEffect和rememberCoroutineScope,以及关键字rem...
- MAC 10.14 安装教程-制作安装EFI文件
-
如果仅限于制作一份可以进入黑苹果安装界面的EFI文件,大家只要稍作了解即可。喜欢折腾的朋友可以自己动手试试。主要设置部分我都会在图中加红圈说明。============================...
- Java14的新特性(质量是指客体的一组固有特性组织应满足的要求的程度,以下不属于)
-
Java语言特性系列Java5的新特性Java6的新特性Java7的新特性Java8的新特性Java9的新特性Java10的新特性Java11的新特性Java12的新特性Java13的新特性Java1...
- 全新版Jetpack进阶提升,系统性落地短视频App(完结)
-
xia仔ke:quangneng.com/2342/全新版Jetpack进阶提升:系统性落地短视频App开发指南在移动应用开发领域,短视频应用凭借其丰富的互动性和娱乐性,吸引了大量用户。为了构建一个高...
- C 语言源程序文件扩展名及相关知识详解
-
本文就来聊一聊C语言源程序文件拼接后生成的文件扩展名是什么?,以及C++源程序文件扩展名对应的知识点是什么。希望对大家有所帮助,别忘了收藏本站哦。在Linux平台上,C语言源代码文件一般以.c为扩展名...
- c语言从头开始(三:编译器工作原理)
-
c语言从头开始(三:编译器工作原理)------------------以gcc编译器为例子,编译实际上总共经历了四个阶段预处理--->编译--->汇编--->链接1.预处理预处理就...
- 编译器 GCC 和 Clang 有什么区别?
-
Clang是一个C语言、C++、Objective-C语言的轻量级编译器,遵循BSD协议。Clang编译速度快、内存占用小、兼容GCC等一些优秀的特点使得很多工具都在使用它。今天就来谈谈Clang和G...
- Meta发布LLM编译器 称将改变我们的编程方式
-
Meta发布了Meta大型语言模型(LLM)编译器,这是一套强大的开源模型,旨在优化代码并彻底改变编译器设计。这项创新有望改变开发人员优化代码的方式,使代码优化更快、更高效、更具成本效益。在将大型语...
- 汇编语言之寄存器(汇编语言寄存器清零指令)
-
1、汇编语言的种类8086汇编(16位)X86汇编(32位)X64汇编(64位)ARM汇编(嵌入式,移动设备)......2、X64汇编X64汇编根据编译器的不同,有2种书写格式:intel和AT&...
- 前端笔记:JS 中 if / if……else……替换方式
-
说说烂大街的if/if...else...,程序中用得最多的流程判断语句。对着曾经满屏的if/if...else...,心想能不能搞点事情,折腾点浪花浪里呀浪。对顶着“这个需求很简单,怎么实现我不管,...
- JS 替换字符串中的文字内容(js 替换字符串中的文字内容是什么)
-
letsrt='helloword'srt.replace('hello','')第一个''为需求替换的内容第二个...
- excel中常用的快捷键Ctrl?H 替换的四种常用使用方法教程
-
Ctrl+H:替换的四种使用技巧。Hello,今天来学习Ctrl+H替换的几种用法。·先来看第一种,搭配通配符星号*来替换数据。这里的星号是通配符,它可以代表任何值,而且没有位数的限制...
- 在 JavaScript 中替换所有指定字符 3 种方法
-
在JS没有提供一种简便的方法来替换所有指定字符。在Java中有一个replaceAll(),replaceAll(Stringregex,Stringreplacement))方法...
- 查找替换的6种典型用法,全在此文,速度围观哦
-
查找替换,应该是Excel中很常见的操作了,但替换之后,并不能得到自己想要的效果,如下图:从示例中可以看出,目的是将“月薪”为0的信息替换为“待发放”,但结果却是将“月薪”中含有“0”的值全部替换为了...
- 「JS 逆向百例」W店UA,OB反混淆,抓包替换CORS跨域错误分析
-
关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!声明本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均...
- 一周热门
- 标签列表
-
- 端口被占用 (84)
- 代码转换 (76)
- ios测试工具 (79)
- require_once (89)
- oracle11g (88)
- oracleparameter (74)
- sessionscope (79)
- asynctask (90)
- oracle创建用户 (78)
- ts文件 (79)
- go microsoft com (75)
- plsql developer 64位 (74)
- 重复数据删除 (77)
- threadlocal (90)
- settimeoutinterval (90)
- weakreference (78)
- adb 命令 (74)
- ajax (76)
- wordpress安装 (77)
- excel vlookup (80)
- widget (77)
- ps复制图层快捷键 (108)
- outofmemory (88)
- divcss (74)
- iis安装教程 (78)