Java做文本编辑器的题目,搜了下看到网上有各种版本的Java文本编辑器,就也发一个,写得很朴素,注释无比详细。
测试过没有Bug,如果有什么问题,欢迎探讨。代码仅供大家借鉴参考,欢迎交流。
用Java实现文本编辑器:创建,浏览、编辑文件;剪贴、复制、粘贴;保存以及另存为;统计字符
一、开发环境
二、程序模块功能描述
(一)文件
(二)编辑
(三)统计
(三)格式:
(四)帮助
三、关键Java API列表
四、运行结果
开发环境:Windows 10操作系统;JDK 13.0.2
运行环境:JRE 13.0.2
开发工具:Notepad++
本项目完成的文本编译器菜单栏有四个选项:文件、编辑、格式、帮助。
文件下拉菜单包括“新建、打开、保存、另存为、退出”5个功能。
编辑下拉菜单包括“剪切、复制、粘贴”3个功能。
统计下拉菜单中有“统计”选项。
格式下拉菜单有“自动换行”功能。
帮助菜单下包括“帮助、关于”两个功能。
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
帮助:
import javax.swing.*;
import java.awt.*;
public class Help extends JFrame{
public Help(){
super("帮助"); //调用父类的构造方法
this.setSize(500, 150); //设置窗口大小,宽度500,高度150
this.setLocation(250,300); //设置窗口位置为距离屏幕左边水平方向250,上方垂直方向300
this.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,高度100
this.setLocation(250,300); //设置窗口位置为距离屏幕左边水平方向250,上方垂直方向300
this.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);
}
}