用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行

article/2025/11/9 11:57:22

Java做文本编辑器的项目,搜了下看到网上有各种版本的Java文本编辑器有很多种,但有的实现很麻烦,最近刚好在做这个实现就也发一个,代码写得很朴素,注释无比详细。

测试过没有Bug,如果有什么问题,欢迎探讨。代码供大家借鉴参考,欢迎交流。

用Java实现文本编辑器:创建,浏览、编辑文件;剪贴、复制、粘贴;保存以及另存为;统计字符

一、开发环境

二、程序模块功能描述

(一)文件

(二)编辑

(三)统计

(三)格式:

(四)帮助

三、关键Java API列表

四、运行结果


一、开发环境

开发环境:Windows 10操作系统;JDK 13.0.2

运行环境:JRE 13.0.2 

开发工具:Notepad++文本编辑器


二、程序模块功能描述

本项目完成的文本编译器菜单栏有四个选项:文件编辑格式帮助

(一)文件

文件下拉菜单包括“新建、打开、保存、另存为、退出”5个功能。

  1. 新建:创建一个新的文本。
  2. 打开:打开一个指定的文本文件。
  3. 保存:存储文本内容修改。
  4. 另存为:把文件存储在其他位置。
  5. 退出:关闭程序。

(二)编辑

编辑下拉菜单包括“剪切、复制、粘贴”3个功能。

  1. 剪切(可以使用快捷键Ctrl + X)
  2. 复制(可以使用快捷键Ctrl + C)
  3. 粘贴(可以使用快捷键Ctrl + V)

(三)统计

  统计下拉菜单中有“统计”选项。

  1. 统计:自动统计已输入字符中汉字、大小写字母等个数。

(三)格式:

格式下拉菜单有“自动换行”功能。

  1. 自动换行:勾选上会自动换行。

(四)帮助

帮助菜单下包括“帮助、关于”两个功能。

  1. 帮助:介绍了文本编辑器如何使用。
  2. 关于:编辑器开发相关信息。

三、关键Java API列表

java.awt.*;
java.awt.event.ActionEvent;
java.awt.event.ActionListener;
java.io.BufferedReader;
java.io.BufferedWriter;
java.io.File;
java.io.FileReader;
java.io.FileWriter;
java.io.IOException;
javax.swing.*;

主框架:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.*;public class TextFrame extends JFrame{public TextFrame(){super("简易文本编辑器");    //调用父类的构造方法//创建菜单栏(JMenuBar)对象JMenuBar mBar = new JMenuBar();//在JFrame等容器中设置菜单栏对象,即将菜单栏添加到框架容器中this.setJMenuBar(mBar);//创建菜单JMenu file = new JMenu("文件");JMenu edit = new JMenu("编辑");JMenu count = new JMenu("统计");JMenu form = new JMenu("格式");JMenu help = new JMenu("帮助");//将菜单添加到菜单栏中mBar.add(file);mBar.add(edit);mBar.add(count);mBar.add(form);mBar.add(help);JTextArea workArea = new JTextArea();  //创建多行文本框JScrollPane imgScrollPane = new JScrollPane(workArea);  //创建一个空视图,只要组件内容超过视图大小就会显示水平和垂直滚动条add(imgScrollPane,BorderLayout.CENTER);  //将当前类的对象实例加到frame的中间位置//定义打开和保存对话框  FileDialog openDia;FileDialog saveDia;  //默认模式为 FileDialog.LOAD  openDia = new FileDialog(this,"打开",FileDialog.LOAD);      saveDia = new FileDialog(this,"另存为",FileDialog.SAVE);  JMenuItem item1_1 = new JMenuItem("新建");  //生成一个对象item1_1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){  //对当前的控件添加监听器,点击控件时就会触发监听函数里面的内容workArea.setText("");  //清空文本 }});JMenuItem item1_2 = new JMenuItem("打开");item1_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){  //对当前的控件添加监听器,点击控件时就会触发监听函数里面的内容openDia.setVisible(true);  //打开文件对话框String dirPath = openDia.getDirectory();  //获取打开文件路径并保存 String fileName = openDia.getFile();  //获取文件名称并保存 //判断打开路径或目录是否为空,则返回空  if(dirPath == null || fileName == null){return ;}  workArea.setText("");//清空文本File fileO = new File(dirPath,fileName); try{BufferedReader bufr = new BufferedReader(new FileReader(fileO));      //尝试从文件中读取内容String line = null;  //变量字符串初始化为空  while((line = bufr.readLine()) != null){workArea.append(line + "\r\n");  //显示每行内容}bufr.close();   //关闭文本}
catch(IOException er1){throw new RuntimeException("文件读取失败!"); }}});JMenuItem item1_3 = new JMenuItem("保存");item1_3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容File fileS = null;if(fileS == null){saveDia.setVisible(true);  //显示保存文件对话框String dirPath = saveDia.getDirectory();  //获取保存文件路径并保存到字符串中String fileName = saveDia.getFile();  //获取保存文件名称并保存到字符串中if(dirPath == null || fileName == null)  //判断路径和文件是否为空return;  //返回空值fileS = new File(dirPath,fileName);  //文件不为空,新建一个路径和名称}try{BufferedWriter bufw = new BufferedWriter(new FileWriter(fileS));                           //尝试从文件中读取内容String text = workArea.getText();  //获取文本内容bufw.write(text);  //将获取文本内容写入到字符输出流bufw.close();  //关闭文件}catch(IOException er){throw new RuntimeException("文件保存失败!"); }}});JMenuItem item1_4 = new JMenuItem("另存为");item1_4.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){   //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容File fileS = null;if(fileS == null){saveDia.setVisible(true);  //显示另存为文件对话框String dirPath = saveDia.getDirectory();  //获取保存文件路径并保存到字符串中String fileName = saveDia.getFile();  //获取保存文件名称并保存到字符串中 if(dirPath == null || fileName == null) //判断路径和文件是否为空return ;   //返回空值fileS = new File(dirPath,fileName);  //文件不为空,新建一个路径和名称}try{BufferedWriter bufw = new BufferedWriter(new FileWriter(fileS));                          //尝试从文件中读取内容String text = workArea.getText();  //获取文本内容bufw.write(text);   //将获取文本内容写入到字符输出流bufw.close();  //关闭文件}
catch(IOException er){throw new RuntimeException("文件保存失败!"); }}});JMenuItem item1_5 = new JMenuItem("退出");item1_5.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容System.exit(0);}});//创建菜单项JMenuItem item2_1 = new JMenuItem("剪切");item2_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.cut();}});JMenuItem item2_2 = new JMenuItem("复制");item2_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.copy();}});JMenuItem item2_3 = new JMenuItem("粘贴");item2_3.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){workArea.paste();}});	    JMenuItem item2_4 = new JMenuItem("统计");item2_4.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容//try代码块,当发生异常时会转到catch代码块中String a = workArea.getText();//定义字符串变量,并赋值为用户输入的信息//创建类进行文件的读取,并指定编码格式为utf-8//char[] ch = a.toCharArray();//把字符串变成char数组int c = 0,h = 0,ll = 0,l = 0,n = 0,o = 0,sum = 0;//定义整型变量,用于统计字符数for(int i = 0;i<a.length();i++){String s = a.substring(i,i+1);if (s.matches("[\\u4e00-\\u9fa5]")) {//if语句的条件,判断是否为汉字h++;//若为汉字则c1自增} else if(s.matches("[A-Z]")){//if语句的条件,判断是否为大写字母ll++;//若为大写字母则c2自增} else if(s.matches("[a-z]")){//if语句的条件,判断是否为小写字母l++;//若为小写字母则c3自增} else if(s.matches("[0-9]")){//if语句的条件,判断是否为数字n++;//若为数字则c4自增} else {//否则可判断为其他字符o++;//若为其他字符则c5自增}}sum = h + ll + l + n + o ;//统计总字符数JOptionPane.showMessageDialog(TextFrame.this, "字数统计:\n汉字:"+h+"\n大写字母:"+ll+"\n小写字母:"+l+"\n数字:"+n+"\n其他字符:"+o+"\n共计"+sum);}});JRadioButtonMenuItem item3_1 = new JRadioButtonMenuItem("自动换行",false);item3_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容Object source = e.getSource();if(source == item3_1)workArea.setLineWrap(true);  //自动换行else if(source != item3_1)workArea.setLineWrap(false);}});JMenuItem item4_1 = new JMenuItem("帮助");item4_1.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容new Help();}});JMenuItem item4_2 = new JMenuItem("关于");item4_2.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent event){  //对当前的控件添加一个监听器,点击控件时就会触发监听函数里面的内容new About ();}});//在菜单中添加菜单项file.add(item1_1);file.add(item1_2);file.add(item1_3);file.add(item1_4);file.add(item1_5);edit.add(item2_1);edit.add(item2_2);edit.add(item2_3);form.add(item3_1);help.add(item4_1);help.add(item4_2);}//构造方法结束	public static void main(String args[]){TextFrame app = new TextFrame();app.setSize(600, 400);  //设置窗口大小,宽度600,高度400app.setLocation(200,200);  //设置窗口位置为距离屏幕左边水平方向200,上方垂直方向200app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   //点击关闭按钮是直接退出app.setVisible(true);  //设置窗体可见}
}

帮助:

import javax.swing.*;
import java.awt.*;public class Help extends JFrame{public Help(){super("帮助");  //调用父类的构造方法this.setSize(500, 150);  //设置窗口大小,宽度500,高度150this.setLocation(250,300);  //设置窗口位置为距离屏幕左边水平方向250,上方垂直方向300this.setResizable(false);  //设置窗体大小不可改变this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);  //点击关闭按钮是直接退出this.setVisible(true);  //设置窗体可见Container c = this.getContentPane();  //初始化一个容器c.setLayout(new GridLayout(3,0));   //将窗口布局设置为网格式布局,网格的行数和列数分别是3和0//创建标签文字JLabel label1 = new JLabel("1、“菜单”中的功能“新建”、“打开”、“保存”、“另存为”、“退出”通过点击对应使用。");JLabel label2 = new JLabel("2、“编辑”中的“剪切”“复制”“粘贴”可对应使用快捷键Ctrl + X、Ctrl + C、Ctrl +V。");JLabel label3 = new JLabel("3、“格式”里的“自动换行”勾选后到窗口边缘自动换行;不勾选则向后继续写入。");c.add(label1);c.add(label2);c.add(label3);  //添加标签到容器中}
}

关于:

import javax.swing.*;public class About extends JFrame{public About(){super("关于"); //调用父类的构造方法this.setSize(280, 100);  //设置窗口大小,宽度280,高度100this.setLocation(250,300);  //设置窗口位置为距离屏幕左边水平方向250,上方垂直方向300this.setResizable(false);  //设置窗体大小不可改变this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);  //点击关闭按钮直接退出this.setVisible(true);  //设置窗体可见JPanel panel = new JPanel();  //使用默认的浮动布局JLabel label1 = new JLabel("这是一个用Java开发的简易文本编译器。"); JLabel label2 = new JLabel("Copyright ©2020 马桂雨");panel.add(label1);panel.add(label2);this.add(panel);}
}

四、运行结果

  • 编辑器界面

  • 打开文件

  • 保存文件

  • 自动换行

  • 统计

  • 帮助

  • 关于


http://chatgpt.dhexx.cn/article/7TEBJ4bU.shtml

相关文章

Java实现简单的文本编辑器

1、首先创建一个编辑器EditorDemo类&#xff0c;继承JFrame类&#xff0c;具体实现编码如下&#xff1a; 2、创建菜单栏&#xff0c;新增各个菜单项&#xff0c;比如文件、编辑、帮助等功能&#xff0c;新增createJMenuBar方法如下&#xff1a; /*** 创建菜单栏* param acti…

你知道在深圳一个月花多少钱吗?

在深圳一个月花多少钱&#xff0c;才能活得比较像样&#xff1f; 早上上班挤地铁转公共&#xff0c;7到10块钱&#xff0c;中午在公司叫一份外卖&#xff0c;22块钱到30块钱&#xff0c;晚上加班和同事一起吃饭&#xff0c;25块左右&#xff0c;赶上末班地铁7块钱&#xff0c;房…

开发一个app需要多少钱

APP应用开发主要分为原生APP和HTML5APP开发&#xff0c;使用HTML5开发的app价格不是很高&#xff0c;但是在体验上&#xff0c;访问速度上比原生的有差距。 第一、商城类app报价计算 以H5的封装案例&#xff0c;价格比较便宜&#xff0c;商城价格几万就能搞定&#xff0c;不会超…

一般培训python要多少钱

Python语言相对简单并且非常适合初学者&#xff0c;使初学者可以专注于编程逻辑&#xff0c;而不会陷入晦涩的语法细节中。 学习python提供了比其他任何编程语言更多的职业发展选择。 那么&#xff0c;python培训班一般要多少钱&#xff1f; 伴随着互联网技术的迅猛发展&…

微信小程序开发一个多少钱

小程序开发是当前比较流行的一项技术服务&#xff0c;能够为企业和个人带来巨大的商业价值和社会价值&#xff0c;但是小程序开发费用也是潜在的成本之一。在选择小程序开发服务时&#xff0c;了解开发费用如何计算、影响价格的因素以及如何降低成本等方面的知识&#xff0c;可…

开发一个App大概要多少钱?

结合自己的各种采坑失败经验以及周边个别成功试水经验&#xff0c;站在个人角度给出一些理解。 APP制作有多种形式&#xff0c;所以需要的成本差异较大。 1.寻找外包公司 2.模板APP&#xff08;内行叫SAAS&#xff09; 3.自己组建团队 目录 互联网外包公司的成本构成&#…

chatgpt赋能python:如何让Python暂停?

如何让Python暂停&#xff1f; Python是一种高级编程语言&#xff0c;常用于数据分析、机器学习等领域。在Python编程中&#xff0c;我们经常需要让程序执行暂停一段时间&#xff0c;等待某些操作完成。本文将介绍如何让Python暂停&#xff0c;以及如何在SEO中优化文章标题&am…

独家 | ChatGPT可以解决分级和分类这样的简单机器学习任务

作者&#xff1a;Damir Yalalov 翻译&#xff1a;陈超 校对&#xff1a;赵茹萱本文约1100字&#xff0c;建议阅读5分钟 本文介绍了ChatGPT如何解决简单的机器学习任务并给出了鸢尾花分类和城市预测两个案例。 一句话概括&#xff1a; ChatGPT可以帮助你完成简单的机器学习任务…

分享 7 个不错的 AI 工具

人工智能的世界继续让我们着迷&#xff0c;近期的 OpenAI ChatGPT 掀起人们对人工智能的更大的期待&#xff0c;本文收集了 7 个人工智能 (AI) 工具&#xff0c;其中大部分易于使用&#xff0c;有些更复杂……比如构建 ML 模型。 1. GFP-GAN&#xff1a;照片修复 GFP-GAN 是一…

你们怎么都有自己的聊天机器人?给我也来一个!

点击左上方蓝字关注我们 PaddlePaddle Wechaty AI ChatBot创意赛正在火热进行中&#xff0c;人工智能时代的ChatBot需要具备哪些能力&#xff1f;由你来定义&#xff01;参赛的小伙伴们果然各显神通&#xff0c;快来pick你心中最中意的聊天机器人吧&#xff0c;并献上你珍贵的…

【AI绘画打卡】| 用漫画生成器绘制宅男最爱的二次元美女

二次元美女在日本文化中已经成为一种流行文化和艺术形式&#xff0c;包括漫画、动画等。由于此类作品的富有想象力、多样性和虚构&#xff0c;像二次元美女这样的虚拟角色往往可以充分满足人们的幻想和情感需求。这也是许多宅男在二次元世界寻找自己理想女友的原因之一。 作品…

进程地址空间详解

进程地址空间 文章目录 进程地址空间验证地址空间的基本排布进程地址空间究竟是什么&#xff1f; 地址空间和物理内存之间的关系为什么要存在地址空间&#xff1f; 我们在学习C语言期间&#xff0c;经常可以提及到这些区域&#xff0c;有一个问题&#xff1a;这里的地址空间是内…

【GlobalMapper精品教程】044:空间操作(1)——交集(Intersection)

GlobalMapper提供的空间分析(操作)的方法有:交集、并集、单并集、差异、对称差集、相交、重叠、接触、包含、等于、内部、分离等,本文主要讲述交集工具的使用。 文章目录 一、实验数据二、符号化设置三、交集运算四、结果展示1. 运行提示2. 空间查看3. 属性表查看五、心灵感…

PostgreSQL的表空间

PostgreSQL之表空间 1、什么是PG中的表空间&#xff08;tablespace&#xff09;&#xff1f; pg中的表空间实际上就是文件系统中的一个目录, 是pg中数据库对象&#xff08;包括表、索引等&#xff09;的容器。 Pg使用操作系统的文件系统进行对象存储&#xff0c;每个数据库对…

Oracle表空间、用户详解

目录 新建连接三者关系表空间创建表空间修改表空间和数据文件修改数据文件容量新增表空间的数据文件重命名数据文件修改表空间状态修改数据文件状态 删除表空间查询 用户创建删除查询修改 新建连接 工具选择&#xff1a; 我们一般会选择一个工具来连接本地的Oracle&#xff0c…

49-Linux_malloc及4G虚拟空间分布

文章目录 malloc及4G虚拟空间分布1.malloc2.32位操作系统进程的4G虚拟空间分布1) 代码区(Text egment)&#xff1a;2) 全局初始化数据区/静态数据区(Data Segment)3) 未初始化数据区(BSS)&#xff1a;4) 堆区(heap)&#xff1a;5) 栈区(stack)&#xff1a; malloc及4G虚拟空间分…

(微信开发)Laya转发H5网页到微信,带图片

网页转发到微信时&#xff0c;带图片和自定义标题。2022年11月22号 关键解说 _wx.config({ debug: _wx_configdebug, appId: e.appId, timestamp: e.timestamp, nonceStr: e.nonceStr, signature: e.signature, jsApiList: [ // 所有要调用的 API 都要加到这个列表中 ‘onMen…

移动端H5页面开发的几种方法

单位&#xff1a; px 宽度百分比&#xff0c;高度px 在不同屏幕下的效果是不一样的&#xff0c;可用媒体查询&#xff08;media&#xff09;对不同宽度的手机进行适配&#xff0c;麻烦&#xff0c;不推荐使用 单位&#xff1a;rem 1、flexible 用法&#xff1a;https://blog.c…

H5页面调用微信支付

1、H5页面使用微信支付&#xff0c;首先需要注册微信公众号&#xff0c;在设置与开发>公众号设置>功能设置中配置业务域名、JS接口安全域名、网页授权域名。支付功能页面需在此域名链接下的页面。 2、加入域名后&#xff0c;就可以在H5页面调用微信支付功能。首先请求后台…

H5实现移动端,PC端页面分享

想做个页面分享功能&#xff0c;既要兼容移动端&#xff0c;也要兼容PC端。 找了一轮&#xff0c;决定PC端用百度分享的api&#xff1a; http://share.baidu.com/code/advance 移动端一开始想用soshm.js&#xff0c;发现ios没问题&#xff0c;但安卓手机在微信上点微博完全没…