百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

用Java代码写一个记事本小程序

yuyutoo 2025-02-26 14:26 9 浏览 0 评论

记事本小程序简介


这是个很小巧的记事本小程序,使用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;
    }

}

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: