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

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

lipiwang 2024-10-29 15:55 7 浏览 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系统下的时间管理是一个复杂但精细的功能,而时区又是时间管理非常重要的一个辅助功能。时区解决了本地时间和UTC时间的差异,从而确保了linux系统下时间戳和时间的准确性和一致性。比如文件的时间...

Linux set命令用法(linux cp命令的用法)

Linux中的set命令用于设置或显示系统环境变量。1.设置环境变量:-setVAR=value:设置环境变量VAR的值为value。-exportVAR:将已设置的环境变量VAR导出,使其...

python环境怎么搭建?小白看完就会!简简单单

很多小伙伴安装了python不会搭建环境,看完这个你就会了Python可应用于多平台包括Linux和MacOSX。你可以通过终端窗口输入"python"命令来查看本地是否...

Linux环境下如何设置多个交叉编译工具链?

常见的Linux操作系统都可以通过包管理器安装交叉编译工具链,比如Ubuntu环境下使用如下命令安装gcc交叉编译器:sudoapt-getinstallgcc-arm-linux-gnueab...

JMeter环境变量配置技巧与注意事项

通过给JMeter配置环境变量,可以快捷的打开JMeter:打开终端。执行jmeter。配置环境变量的方法如下。Mac和Linux系统在~/.bashrc中加如下内容:export...

C/C++|头文件、源文件分开写的源起及作用

1C/C++编译模式通常,在一个C++程序中,只包含两类文件——.cpp文件和.h文件。其中,.cpp文件被称作C++源文件,里面放的都是C++的源代码;而.h文件则被称...

linux中内部变量,环境变量,用户变量的区别

unixshell的变量分类在Shell中有三种变量:内部变量,环境变量,用户变量。内部变量:系统提供,不用定义,不能修改环境变量:系统提供,不用定义,可以修改,可以利用export将用户变量转为环...

在Linux中输入一行命令后究竟发生了什么?

Linux,这个开源的操作系统巨人,以其强大的命令行界面而闻名。无论你是初学者还是经验丰富的系统管理员,理解在Linux终端输入一条命令并按下回车后发生的事情,都是掌握Linux核心的关键。从表面上看...

Nodejs安装、配置与快速入门(node. js安装)

Nodejs是现代JavaScript语言产生革命性变化的一个主要框架,它使得JavaScript从一门浏览器语言成为可以在服务器端运行、开发各种各样应用的通用语言。在不同的平台下,Nodejs的安装...

Ollama使用指南【超全版】(olaplex使用方法图解)

一、Ollama快速入门Ollama是一个用于在本地运行大型语言模型的工具,下面将介绍如何在不同操作系统上安装和使用Ollama。官网:https://ollama.comGithub:http...

linux移植(linux移植lvgl)

1uboot移植l移植linux之前需要先移植一个bootlader代码,主要用于启动linux内核,lLinux系统包括u-boot、内核、根文件系统(rootfs)l引导程序的主要作用将...

Linux日常小技巧参数优化(linux参数调优)

Linux系统参数优化可以让系统更加稳定、高效、安全,提高系统的性能和使用体验。下面列出一些常见的Linux系统参数优化示例,包括修改默认配置、网络等多方面。1.修改默认配置1.1修改默认编辑器默...

Linux系统编程—条件变量(linux 条件变量开销)

条件变量是用来等待线程而不是上锁的,条件变量通常和互斥锁一起使用。条件变量之所以要和互斥锁一起使用,主要是因为互斥锁的一个明显的特点就是它只有两种状态:锁定和非锁定,而条件变量可以通过允许线程阻塞和等...

面试题-Linux系统优化进阶学习(linux系统的优化)

一.基础必备优化:1.关闭SElinux2.FirewalldCenetOS7Iptables(C6)安全组(阿里云)3.网络管理服务||NetworkManager|network...

嵌入式Linux开发教程:Linux Shell

本章重点介绍Linux的常用操作和命令。在介绍命令之前,先对Linux的Shell进行了简单介绍,然后按照大多数用户的使用习惯,对各种操作和相关命令进行了分类介绍。对相关命令的介绍都力求通俗易懂,都给...

取消回复欢迎 发表评论: