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

createh51个月前 (02-07)技术教程10

记事本小程序简介


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

}

相关文章

Java实现文件上传和下载的方法详解

Java实现文件上传和下载的方法详解,Java实现文件上传和下载解决方案,Java实现文件上传和下载思路,Java实现文件上传和下载源码,Java实现文件上传和下载实例,Java实现文件分块上传和下载...

如何理解Java中的包机制,如何有效使用JavaDoc生成文档

包机制一般用公司域名倒置作为包名:如百度网址www.baidu.com,包命名为com.baidu.www(com.yang)包必须在类的最上面,导入包使用语句import package 包名.(是...

java如何高效地读取一个超大文件?(四种方式分析对比)

前言我最近在优化我的PDF转word的开源小工具,有时候会遇到一个问题,就是如果我的PDF文件比较大,几百兆,如何更快更节省内存的读取它。于是我分析对比了四种常见的读取文件的方式,并使用javaVis...

Java之在.java文件类中调用js方法

此场景,适用于无Html页面,纯后台调式脚本语言。首先创建一个js文件,放在resource下的静态文件下// 供java进行调用 function hello(str) { var co...

Mybatis配置文件XML全貌详解,再不懂我也没招了

一、为什么要使用配置文件试想,如果没有配置文件,我们的应用程序将只能沿着固定的姿态运行,几乎不能做任何动态的调整,那么这不是一套完美的设计,因为我们希望拥有更宽更灵活的操作空间和更多的兼容度,同时也能...

SpringBoot实现大文件上传/下载(分片、断点续传)

SpringBoot实现大文件上传/下载(分片、断点续传),SpringBoot实现大文件上传/下载解决方案,SpringBoot实现大文件上传/下载思路,SpringBoot实现大文件上传/下载实例...