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

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

yuyutoo 2025-02-26 14:26 2 浏览 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;
    }

}

相关推荐

网站建设:从新手到高手

现代化网站应用领域非常广泛,从个人形象网站展示、企业商业网站运作、到政府公益等服务网站,各行各业都需要网站建设。大体上可以归结四类:宣传型网站设计、产品型网站制作、电子商务型网站建设、定制型功能网站开...

JetBrains 推出全新 AI 编程工具 Junie,助力高效开发

JetBrains宣布推出名为Junie的全新AI编程工具。这款工具不仅能执行简单的代码生成与检查任务,还能应对编写测试、验证结果等复杂项目,为开发者提供全方位支持。根据SWEBench...

AI也能写代码!代码生成、代码补全、注释生成、代码翻译轻松搞定

清华GLM技术团队打造的多语言代码生成模型CodeGeeX近期更新了新的开源版本「CodeGeeX2-6B」。CodeGeeX2是多语言代码生成模型CodeGeeX的第二代模型,不同于一代CodeG...

一键生成前后端代码,一个36k星的企业级低代码平台

「企业级低代码平台」前后端分离架构SpringBoot2.x,SpringCloud,AntDesign&Vue,Mybatis,Shiro,JWT。强大的代码生成器让前后端代码一键生成,无需写任...

Gitee 代码托管实战指南:5 步完成本地项目云端同步(附避坑要点)

核心流程拆解:远程仓库的搭建登录Gitee官网(注册账号比较简单,大家自行操作),点击“新建仓库”,建议勾选“初始化仓库”和“设置模板文件”(如.gitignore),避免上传临时文件。...

jeecg-boot 源码项目-强烈推荐使用

JEECGBOOT低代码开发平台...

JetBrains推出全新AI编程工具Junie,强调以开发者为中心

IT之家2月1日消息,JetBrains发文,宣布推出一款名为Junie的全新AI编程工具,官方声称这款AI工具既能执行简单的代码生成与检查等基础任务,也能应对“编写测试、验证结...

JetBrains旗下WebStorm和Rider现已加入“非商用免费”阵营

IT之家10月25日消息,软件开发商JetBrains今日宣布,旗下WebStorm(JavaScript开发工具)和Rider(.NET开发工具)现已加入“非商用免费”阵营。如果...

谈谈websocket跨域

了解websocketwebsocket是HTML5的新特性,在客户端和服务端提供了一个基于TCP连接的双向通道。...

websocket调试工具

...

利用webSocket实现消息的实时推送

1.什么是webSocketwebSocket实现实现推送消息WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议。以前的推送技术使用Ajax轮询,浏览器需...

Flutter UI自动化测试技术方案选型与探索

...

为 Go 开发的 WebSocket 库

#记录我的2024#...

「Java基础」Springboot+Websocket的实现后端数据实时推送

这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。...

【Spring Boot】WebSocket 的 6 种集成方式

介绍...

取消回复欢迎 发表评论: