用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行
Java做文本编辑器的项目,搜了下看到网上有各种版本的Java文本编辑器有很多种,但有的实现很麻烦,最近刚好在做这个实现就也发一个,代码写得很朴素,注释无比详细。
测试过没有Bug,如果有什么问题,欢迎探讨。代码供大家借鉴参考,欢迎交流。
用Java实现文本编辑器:创建,浏览、编辑文件;剪贴、复制、粘贴;保存以及另存为;统计字符
一、开发环境
二、程序模块功能描述
(一)文件
(二)编辑
(三)统计
(三)格式:
(四)帮助
三、关键Java API列表
四、运行结果
一、开发环境
开发环境:Windows 10操作系统;JDK 13.0.2
运行环境:JRE 13.0.2
开发工具:Notepad++文本编辑器
二、程序模块功能描述
本项目完成的文本编译器菜单栏有四个选项:文件、编辑、格式、帮助。
(一)文件
文件下拉菜单包括“新建、打开、保存、另存为、退出”5个功能。
- 新建:创建一个新的文本。
- 打开:打开一个指定的文本文件。
- 保存:存储文本内容修改。
- 另存为:把文件存储在其他位置。
- 退出:关闭程序。
(二)编辑
编辑下拉菜单包括“剪切、复制、粘贴”3个功能。
- 剪切(可以使用快捷键Ctrl + X)
- 复制(可以使用快捷键Ctrl + C)
- 粘贴(可以使用快捷键Ctrl + V)
(三)统计
统计下拉菜单中有“统计”选项。
- 统计:自动统计已输入字符中汉字、大小写字母等个数。
(三)格式:
格式下拉菜单有“自动换行”功能。
- 自动换行:勾选上会自动换行。
(四)帮助
帮助菜单下包括“帮助、关于”两个功能。
- 帮助:介绍了文本编辑器如何使用。
- 关于:编辑器开发相关信息。
三、关键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);}
}
四、运行结果
- 编辑器界面
- 打开文件
- 保存文件
- 自动换行
- 统计
- 帮助
- 关于
用Java实现文本编辑器:创建、浏览、编辑文件;剪贴、复制、粘贴;保存、另存为;字符统计;自动换行相关推荐
- linux 如何打包分区文件,Linux基础------文件打包解包---tar命令,文件压缩解压---命令gzip,vim编辑器创建和编辑正文件,磁盘分区/格式化,软/硬链接...
作业一: 1)将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖) cat /etc/passwd /etc/group > /1.txt 2)将用户信息数据库文件和用户 ...
- linux创建和编辑文件,linux基础-第九单元 利用vi编辑器创建和编辑正文文件
vi编辑器简介 什么是vi vi编辑器的操作模式 vi编辑器的3种基本模式 在vi编辑器中光标的移动 移动光标位置的键与光标移动间的关系 进入插入模式 从命令行模式进入插入模式的命令 在命令行模式下删 ...
- 文本编辑器创建状态栏
文章目录 1 文本编辑器创建状态栏 1 文本编辑器创建状态栏 在MainWindow.h中声明如下函数: bool initStatusBar(); 在MainWindow.cpp中实现上述函数函数: ...
- 文本编辑器创建工具栏
文章目录 1 文本编辑器创建工具栏 1 文本编辑器创建工具栏 在MainWindow.h中增加如下函数声明: bool initToolBar(); bool initFileToolItem(QTo ...
- 文本编辑器创建菜单栏
文章目录 1 文本编辑器创建菜单栏 1 文本编辑器创建菜单栏 基于QMainWindow开发一款文本编辑器,首先实现创建菜单栏的代码: 项目文件构成如下: MainWindow.h: #ifndef ...
- JAVA写文本编辑器(四)
其实写到这里,我已经差不多断气了... 常规套路,这里是前三篇的传送门,需要的同学可以看一下:JAVA写文本编辑器(三) JAVA写文本编辑器(二)JAVA写文本编辑器(一) 现在我们只差最后一部分了 ...
- JavaWeb 富文本编辑器(Ckeditor)文件上传
目录 一.什么是富文本编辑器? 二.CKEditor介绍 三.CKEditor下载 四.使用富文本编辑器 五.文件上传 一.什么是富文本编辑器? 富文本编辑器是一种可内嵌于浏览器,所见即所得的文本编辑 ...
- 文本编辑器实现打开帮助文件的功能
文章目录 1 文本编辑器实现打开帮助文件的功能 1 文本编辑器实现打开帮助文件的功能 打开外部文件: QDesktopServices提供了一系列桌面开发相关的服务接口. 通过QDesktopServ ...
- 10-1Python学习笔记 10-2C语言学习笔记 : 在文本编辑器中新建一个文件, 写几句话来总结一下你至此学到的Python知识
10-1 Python学习笔记 : 在文本编辑器中新建一个文件, 写几句话来总结一下你至此学到的Python知识, 其中每一行都以"In Python you can"打头. 将这 ...
- Java实现TXT文件的复制粘贴
导语:在日常的生活中,在我们使用计算机的过程中,复制粘贴往往给办公.学习等带来了很大的方便,毕竟人类的本质就是复读机,但是Ctrl+C和Crtl+V的方法是在操作系统上实现的,那么程序员要如何通过Ja ...
最新文章
- 如何在html页面循环回显数据,从while循环显示数据到html代码
- Android studio官网资料
- [转]Cocos2d-x观察者模式
- 计算机隐藏用户设置,在开始屏幕(欢迎屏幕、控制面板的用户账户设置)上隐藏用户账户和开机自动登录某个账户...
- mongo占用内存过大解决方案
- C# GDI+ 绘图
- C#生成新浪微博短网址 示例源码
- python 字符串比较忽略大小写的方法_python实现忽略大小写对字符串列表排序的方法...
- git 提交代码到新的库,不保留原来的提交历史记录
- SSH框架微服务改进实战
- 时尚服装行业挑战及软件机遇分享 -- 许鹏
- Gom引擎Key.lic配套的X-FKGOM授权启动
- 计算机对教育的重要性 英语作文,关于教育的英语作文 教育重要性英语作文!
- Excel表格中选择性粘贴如何粘贴为数值
- Android时间轴,RecyclerView实现
- php7.4 ffi,PHP 7.4 前瞻:FFI
- Tony.SerialPorts.RS232串口模块(三)
- [Docer]docker镜像操作
- POC原型开发:巡店 一期结果
- couldn't create PTY
热门文章
- 打算开源一个低代码平台,第二天,包含【工作流,业务流,财务,APQC】。技术站 React,typescript,java,mysql
- html在线取色,JS实现的RGB网页颜色在线取色器完整实例
- 海南移动IPTV——使用的小Tips
- ev3的c语言编程软件,乐高EV3编程软件教育版下载
- Java安装包(JDK)安装和运行环境配置【超全】
- (原)SCOR模型在化工行业的应用
- appscan初次接触
- matlab 数据字典,以编程方式将数据存储到字典中
- 小米音箱蓝牙连不上_小米互联网音箱蓝牙怎么连接?方法如下
- 导出excel文件,若在一台PC端无法正常导出,闪退,进程还存在时(以下方法也许对你有用)