教你用Java GUI实现文本文件的读写
作者:wayne_lee_lwc 发布时间:2023-05-25 06:47:13
一、实验题目
二、分析
实验要求为:
实现一个界面,界面中包含一个文本显示区和两个按钮(存档和读档)
读档按钮作用是打开文件并读取内容,将内容显示在文本区中
存档按钮作用是将文本区的内容写入到文件中。
简单分析一下,可以看出这样的要求奥,包含的要考察知识点主要有两个方向:
GUI绘制界面并添加事件
使用IO流对象对文件进行读写
好的小伙伴们,废话不多说,下面就来的实现它。
三、实现
首先,让我们创建一个GUI界面,先秉持着一切从简的设计思想,预计它长这样:
这样的布局方式,我们可以选择采用流布局实现,在容器中直接放入文本显示区和两个按钮,适当调整窗口大小即可实现:
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GUIDemo extends JFrame{
//三个组件
private JButton saveButton;
private JButton loadButton;
private TextArea textArea;
//容器
private Container container;
public GUIDemo() {
//设置title
super("File Demo");
//设置流布局
setLayout(new FlowLayout());
//获取容器
container = getContentPane();
//三个组件
textArea = new TextArea();
saveButton = new JButton("save");
loadButton = new JButton("load");
//保存文件按钮点击事件
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("存档成功");
}
});
//读入文件按钮点击事件
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("读档成功");
}
});
//装填三个组件
container.add(textArea);
container.add(loadButton);
container.add(saveButton);
//调整大小
setSize(500, 300);
//显示
setVisible(true);
}
public static void main(String[] args) {
GUIDemo demo = new GUIDemo();
demo.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
代码的含义都在注释里面,就不啰嗦讲解了。
跑起来是这个样子:
点击两下按钮测试点击事件,控制台输出:
好的,GUI界面设计完毕,下面来为两个按钮编写点击事件。
首先要解决的一个问题是“目标文件”。由于题目中没有提到目标文件是否需要从文件系统中选取产生,那么我们不妨暂时将目标文件地址直接在代码中,令private static final String TARGET_FILE= "./temp.txt";
那么在初始化页面时就应该先创建这个文件路径对应的file对象:
//目标文件
private File targetFile;
...
//创建目标文件对象
targetFile = new File(TARGET_FILE);
if(targetFile.createNewFile()) {
System.out.println("文件不存在,创建成功");
}else {
System.out.println("文件存在");
}
这里需要注意几个问题:
1.创建目标文件需要使用createNewFile()
方法,而非mkdir()
方法。否则会创建成为文件夹而非文件
2.createNewFile()方法会抛出一个IOException,为了便于处理,这里直接选择将异常从构造方法和主方法中抛出;
处理好目标文件问题,两次启动程序,可以看到控制台输出:
哦吼,文件处理成功。
接着,就是在为两个按钮添加点击事件。在下面的处理中,对于IO流的选择,我们统一选择字符流.
首先是读档按钮,它的点击事件逻辑大致为:
1.创建目标文件的输入字符流
2.从输入流中读取文件中的内容并形成结果
3.关闭输入流
4.将读入的结果显示在文本显示区中
实现成为代码:
//读入文件按钮点击事件
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
//字符读入流
FileReader reader = new FileReader(targetFile);
//读入缓冲区
char[] buffer = new char[1024];
//读入结果
StringBuffer result = new StringBuffer();
//每次读入缓冲区的长度
int len;
//从读入流中读取文件内容并形成结果
while((len = reader.read(buffer)) != -1) {
result.append(buffer,0,len);
}
//关闭读入流
reader.close();
//更新文本显示区内容
textArea.setText(result.toString());
System.out.println("读档成功");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
在目标文件中写下Hello World!!
,运行程序,点击load
:
nice~~
好的,接下来就剩下最后一项任务了,完成存档!
存档按钮的点击事件应该为:
1.打开目标文件字符输出流
2.获取当前文本显示区的内容
3.将文本显示区的内容通过输出流写入文件
4.关闭输出流
5.清空文本显示区
哦吼,最后一条是我加上去的,其实不清空也可以。
代码实现如下:
//保存文件按钮点击事件
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
//打开文件字符输出流
FileWriter writer = new FileWriter(targetFile);
//获取文本显示区文本
String result = textArea.getText();
//写入文件
writer.write(result);
//关闭输出流
writer.close();
//清空文本显示区内容
textArea.setText("");
System.out.println("存档成功");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
在文本显示区中输入Hello Java!!
,点击save
:
啥?你说文本框里面啥也没有?对,因为最后把内容清空了!
四、全部代码
好了,实现了上面的全部功能,最后把代码汇总在这里:
(谨慎抄袭哦)
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
public class GUIDemo extends JFrame{
private static final String TARGET_FILE = "./temp.txt";
//三个组件
private JButton saveButton;
private JButton loadButton;
private TextArea textArea;
//容器
private Container container;
//目标文件
private File targetFile;
public GUIDemo() throws IOException {
//设置title
super("File Demo");
//设置流布局
setLayout(new FlowLayout());
//获取容器
container = getContentPane();
//创建目标文件对象
targetFile = new File(TARGET_FILE);
if(targetFile.createNewFile()) {
System.out.println("文件不存在,创建成功");
}else {
System.out.println("文件存在");
}
//三个组件
textArea = new TextArea();
saveButton = new JButton("save");
loadButton = new JButton("load");
//保存文件按钮点击事件
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
//打开文件字符输出流
FileWriter writer = new FileWriter(targetFile);
//获取文本显示区文本
String result = textArea.getText();
//写入文件
writer.write(result);
//关闭输出流
writer.close();
//清空文本显示区内容
textArea.setText("");
System.out.println("存档成功");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//读入文件按钮点击事件
loadButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
//字符读入流
FileReader reader = new FileReader(targetFile);
//读入缓冲区
char[] buffer = new char[1024];
//读入结果
StringBuffer result = new StringBuffer();
//每次读入缓冲区的长度
int len;
//从读入流中读取文件内容并形成结果
while((len = reader.read(buffer)) != -1) {
result.append(buffer,0,len);
}
//关闭读入流
reader.close();
//更新文本显示区内容
textArea.setText(result.toString());
System.out.println("读档成功");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
//装填三个组件
container.add(textArea);
container.add(loadButton);
container.add(saveButton);
//调整大小
setSize(500, 300);
//显示
setVisible(true);
}
public static void main(String[] args) throws IOException {
GUIDemo demo = new GUIDemo();
demo.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
来源:https://blog.csdn.net/wayne_lee_lwc/article/details/117091296


猜你喜欢
- 首先演示下效果,分段选择按钮,支持点击和滑动切换。视图绘制过程中,要执行onMeasure、onLayout、onDraw等方法,这也是自定
- 在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识:WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是
- 下面是配置Android开发ADB环境变量的操作步骤。工具/原料win7系统电脑+Android SDK方法/步骤1.首先右击计算机——属性
- 本文实例讲述了java中struts2实现文件上传下载功能实现方法。分享给大家供大家参考。具体分析如下:1.文件上传首先是jsp页面的代码在
- Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是
- 本文实例讲述了C#从DataTable获取数据的方法。分享给大家供大家参考。具体如下:通过通用类,返回一个DataTable,要想显示每个单
- 1.Maven依赖<!-- Kettle --><dependency> <grou
- 需求:应用A(通常有多个)和应用B(1个)进行 socket通讯,应用A必须知道应用B的ip地址(在应用A的配置文件中写死的),这个时候就必
- springBoot yml文件的list读取问题折腾了很久,记录下。配置如下# 自定义数据上报信息xx: # 机组信息 &nb
- 高斯模糊高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像
- 记录下一个很实用的小控件EditTextWithDel,就是在Android系统的输入框右边加入一个小图标,点击小图标可以清除输入框里面的内
- 一 :问题背景问题:当查询接口较复杂时候,数据的获取都需要[远程调用],必然需要花费更多的时间。 假如查询文章详情页面,需要如下标注的时间才
- 一、ThreadPool概述提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步 I/O、代表其他线程等待以及处理计时器。创建线程需
- 本文实例讲述了Java实现的质因数分解操作。分享给大家供大家参考,具体如下:这里演示java通过递归实现质因数分解,代码如下:import
- 在官方的这篇文档中为大家介绍了如何使用Java开启Azure Windows虚拟机的诊断设置这篇文章呢,为大家介绍一下如何使用Java开启L
- 本文实例讲述了java swing实现的扫雷游戏及改进版。分享给大家供大家参考,具体如下:版本1:package awtDemo;impor
- 本案例通过使用JFileChooser实现对选定文件夹内图片实现自动播放和暂停播放代码如下,如有不合适的地方 还请指教package com
- 一、首先将网页内容整个抓取下来,数据放在byte[]中(网络上传输时形式是byte),进一步转化为String,以便于对其操作,实例如下:p
- 一、为什么要控制当你在项目启动时需要提前做一个业务的初始化工作时,或者你正在开发某个中间件需要完成自动装配时。你会声明自己的Configur
- 概念Java中的集合就是一种容器,可以容纳不同种类的数据,这些容纳是建立在未知的基础上。优点1.可以动态保存任意多个对象,使用比较方便。2.