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

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

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

}

相关推荐

自卑的人容易患抑郁症吗?(自卑会导致抑郁吗)

Filephoto[Photo/IC]Lowself-esteemmakesusfeelbadaboutourselves.Butdidyouknowthatovert...

中考典型同(近)义词组(同义词考题)

中考典型同(近)义词组...

WPF 消息传递简明教程(wpf messagebox.show)

...

BroadcastReceiver的原理和使用(broadcast-suppression)

一、使用中注意的几点1.动态注册、静态注册的优先级在AndroidManifest.xml中静态注册的receiver比在代码中用registerReceiver动态注册的优先级要低。发送方在send...

Arduino通过串口透传ESP 13板与java程序交互

ESP13---是一个无线板子,配置通过热点通信Arduino通过串口透传ESP13板与java程序交互...

zookeeper的Leader选举源码解析(zookeeper角色选举角色包括)

作者:京东物流梁吉超zookeeper是一个分布式服务框架,主要解决分布式应用中常见的多种数据问题,例如集群管理,状态同步等。为解决这些问题zookeeper需要Leader选举进行保障数据的强一致...

接待外国人英文口语(接待外国友人的英语口语对话)

接待外国人英文口语询问访客身份:  MayIhaveyourname,please?  请问您贵姓?  Whatcompanyareyoufrom?  您是哪个公司的?  Could...

一文深入理解AP架构Nacos注册原理

Nacos简介Nacos是一款阿里巴巴开源用于管理分布式微服务的中间件,能够帮助开发人员快速实现动态服务发现、服务配置、服务元数据及流量管理等。这篇文章主要剖析一下Nacos作为注册中心时其服务注册与...

Android面试宝典之终极大招(android面试及答案)

以下内容来自兆隆IT云学院就业部,根据多年成功就业服务经验,以及职业素养课程部分内容,归纳总结:18.请描述一下Intent和IntentFilter。Android中通过Intent...

除了Crontab,Swoole Timer也可以实现定时任务的

一般的定时器是怎么实现的呢?我总结如下:1.使用Crontab工具,写一个shell脚本,在脚本中调用PHP文件,然后定期执行该脚本;2.ignore_user_abort()和set_time_li...

Spark源码阅读:DataFrame.collect 作业提交流程思维导图

本文分为两个部分:作业提交流程思维导图关键函数列表作业提交流程思维导图...

使用Xamarin和Visual Studio开发Android可穿戴设备应用

搭建开发环境我们需要做的第一件事情是安装必要的工具。因此,你需要首先安装VisualStudio。如果您使用的是VisualStudio2010,2012或2013,那么请确保它是一个专业版本或...

Android开发者必知的5个开源库(android 开发相关源码精编解析)

过去的时间里,Android开发逐步走向成熟,一个个与Android相关的开发工具也层出不穷。不过,在面对各种新鲜事物时,不要忘了那些我们每天使用的大量开源库。在这里,向大家介绍的就是,在这个任劳任怨...

Android事件总线还能怎么玩?(android实现事件处理的步骤)

顾名思义,AndroidEventBus是一个Android平台的事件总线框架,它简化了Activity、Fragment、Service等组件之间的交互,很大程度上降低了它们之间的耦合,使我们的代码...

Android 开发中文引导-应用小部件

应用小部件是可以嵌入其它应用(例如主屏幕)并收到定期更新的微型应用视图。这些视图在用户界面中被叫做小部件,并可以用应用小部件提供者发布。可以容纳其他应用部件的应用组件叫做应用部件的宿主(1)。下面的截...

取消回复欢迎 发表评论: