Java基础:图形化记事本程序
程序员文章站
2022-03-19 15:30:56
题目编写一个笔记本程序要求 1.要有图形化界面 2.能实现编辑、保存、修改、添加功能 3.使用文字输入流先分析一波1.这个笔记本程序只能是我们个人的,所以得设置一个登录程序,可不能让其他人发现我们的小秘密2.得有图形化界面,就要用到JFrame3.设计文件的读写,就要用到文件的操作File,和数据流的操作4.文件的存储我们以可以自定义文件名称,然后创建对应的文件,并向里面写入我们需要保存的内容开始编写代码大概分析了一波我们需要用到的技术点,现...
题目
编写一个笔记本程序
要求
1.要有图形化界面
2.能实现编辑、保存、修改、添加功能
3.使用文字输入流
先分析一波
1.这个笔记本程序只能是我们个人的,所以得设置一个登录程序,可不能让其他人发现我们的小秘密
2.得有图形化界面,就要用到JFrame
3.设计文件的读写,就要用到文件的操作File,和数据流的操作
4.文件的存储我们以可以自定义文件名称,然后创建对应的文件,并向里面写入我们需要保存的内容
开始编写代码
大概分析了一波我们需要用到的技术点,现在我们就可以开始写一点代码了
首先我们需要做一个登录界面,输入登录用户名和密码后和我们预先设好的用户名和密码做比较,输入正确就打开笔记本列表,不正确则提示密码或用户名错误
/**
* 登录界面
* @param panel
* @param jFrame
*/
private static void initLogin(JPanel panel,JFrame jFrame) {
//布局
panel.setLayout(null);
// 创建 JLabel 标签 用户名
JLabel userLabel = new JLabel("用户名:");
//定义组件位置 x 和 y 指定左上角的新位置,由 width 和 height 指定新的大小
userLabel.setBounds(10,20,80,25);
panel.add(userLabel);
//创建输入框组件 用户名文本域
JTextField userText = new JTextField(20);
userText.setBounds(100,20,165,25);
panel.add(userText);
// 创建 JLabel 标签 密码
JLabel passwordLabel = new JLabel("密码:");
passwordLabel.setBounds(10,50,80,25);
panel.add(passwordLabel);
//创建输入框组件 输入密码的文本域 这个类输入的信息会以点号代替,用于包含密码的安全性
JPasswordField passwordText = new JPasswordField(20);
passwordText.setBounds(100,50,165,25);
panel.add(passwordText);
// 创建登录按钮
JButton loginButton = new JButton("登录");
loginButton.setBounds(120,100,80,25);
panel.add(loginButton);
//为按钮添加点击事件,点击后判断用户名和密码正确性
loginButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String userName = userText.getText();
String password = String.valueOf(passwordText.getPassword());
if ("admin".equals(userName) && "123456".equals(password)){
jFrame.dispose();
//接着做后续操作
System.out.println("登录成功");
//查询文件列表
List<String> fileNameList = queryFile();
initNotbookList(fileNameList);
}else{
//用户密码不对
tip("登录用户或密码不正确");
}
}
});
}
对了,还有个消息提示的方法(提示的方法是统一的,提示的内容可以根于具体的需要传入即可),一个 提示框可以添加一些用户的友好交互性
/**
* 提示信息弹窗
* @param msg
*/
private static void tip(String msg){
JFrame tipFrame = new JFrame("提示");
tipFrame.setSize(220,100);
//设置窗口生出位置
tipFrame.setLocationRelativeTo(null);
JLabel tipLabel = new JLabel(msg);
tipLabel.setForeground(Color.red);
tipFrame.add(tipLabel);
tipFrame.setVisible(true);
}
这里会遇到一个问题:多个窗口的显示与关闭,只要第一个窗口设置关闭事件,其他窗口不设置就行
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
好了!登录写好了,我们接着登录以后的事情了!登录成功后要跳转到文件列表像是已经存在的笔记本文件,这里得用到文件夹的读取,以及获取该文件夹下文件名称列表,废话不多说,上代码
/**
* 查询文件夹下已存在的文件
* FilePath 为文件路径,之前已设置为全局变量
* @return
*/
private static List<String> queryFile(){
File file = new File(FilePath);
//判断文件夹是否存在,不存在就先创建
if (!file.exists() || !file.isDirectory()){
//mkdir() : 创建此抽象路径名指定的目录。
//mkdirs() : 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。
file.mkdir();
}
// 读取目录下的所有目录文件信息
String[] files = file.list();
return Arrays.asList(files);
}
将获取到文件列表利用循环和swing的按钮JButton以按钮的形式在图形化界面上展示,之后做内容的显示以及修改可以以按钮的形式进行
/**
* 初始化记事本列表
* @param fileName
*/
private static void initNotbookList(List<String> fileName){
// 创建 JFrame 实例
JFrame frame = new JFrame("笔记列表(点击进入修改)");
// Setting the width and height of frame
//设置窗口大小
frame.setSize(320, 200);
//设置窗口生出位置
frame.setLocationRelativeTo(null);
//添加关闭动作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建JPanel 画布实例
JPanel panel = new JPanel();
for (String name : fileName) {
// 创建笔记列表按钮
JButton fileButton = new JButton(name);
fileButton.setBounds(120,100,80,25);
panel.add(fileButton);
frame.add(panel);
fileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//读入文件方法
}
});
}
//这里在添加两个按钮(一个添加的按钮和退出的按钮)
// 设置添加按钮
JButton addButton = new JButton("+");
addButton.setBounds(120,100,80,25);
panel.add(addButton);
frame.add(panel);
addButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
initNotbookMain("","");
}
});
// 设置退出按钮
JButton exitButton = new JButton("退出");
exitButton.setBounds(120,100,80,25);
panel.add(exitButton);
frame.add(panel);
exitButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
// 设置界面可见
frame.setVisible(true);
}
现在我们写好了展示部分!接下来就是文件以及文件内容的存储和回显了;
照例,我们先弄个编辑页面,代码走着
/**
* 笔记添加或修改界面
*/
private static void initNotbookMain(String fileName,String fileContent){
// 创建 JFrame 实例
JFrame frame = new JFrame("笔记内容");
// Setting the width and height of frame
//设置窗口大小
frame.setSize(280, 450);
//设置窗口生出位置
frame.setLocationRelativeTo(null);
//添加关闭动作
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//创建JPanel 画布实例
JPanel panel = new JPanel();
//设置记事本标题
JLabel notbookTitle = new JLabel("标题:");
notbookTitle.setBounds(10,50,80,25);
panel.add(notbookTitle);
//创建输入框组件 用户名文本域
JTextField notbookTitleText = new JTextField(20);
notbookTitleText.setBounds(100,20,165,25);
//如果有文件名就赋值
if (!"".equals(fileName)){
//截取文件名(不要后缀)
//substring(".")按.来分割 eg:test.txt 取第一个到"."出现的位置中间的值
String name = fileName.substring(0,fileName.indexOf("."));
notbookTitleText.setText(name);
}
panel.add(notbookTitleText);
//设置记事本内容
JLabel content = new JLabel("内容:");
content.setBounds(10,100,80,25);
panel.add(content);
//创建输入框组件 用户名文本域
// 创建一个 20 行 20 列的文本区域
JTextArea contentText = new JTextArea(20,20);
// 设置自动换行
contentText.setLineWrap(true);
panel.add(contentText);
//如果有内容就赋值
if(!"".equals(fileContent)){
contentText.setText(fileContent);
}
// 创建保存按钮
JButton saveButton = new JButton("保存");
saveButton.setBounds(120,100,80,25);
panel.add(saveButton);
// 创建返回按钮(返回列表)
JButton returnButton = new JButton("返回");
returnButton.setBounds(120,100,80,25);
panel.add(returnButton);
frame.add(panel);
saveButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//调用保存方法
saveWorld(notbookTitleText.getText(), contentText.getText());
}
});
returnButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.dispose();
List<String> fileList = queryFile();
initNotbookList(fileList);
}
});
// 设置界面可见
frame.setVisible(true);
}
还有一个保存方法
/**
* 文件保存
* @param fileName
* @param content
*/
private static void saveWorld(String fileName,String content){
//读取文件
File file=new File(FilePath + fileName+".txt");
//判断文件是否存在
if (!file.exists()){
//如果不存在就尝试创建
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
OutputStream os = new FileOutputStream(file);
PrintWriter pw=new PrintWriter(os);
pw.println(content);
pw.close();
tip("内容保存成功");
}catch (Exception e){
System.out.println("写入错误");
tip("内容保存失败");
}
}
返回列表也有了
这么一来,我们就是可以写东西保存了,打开文件夹看下是否有了
接着来修改的,之前我们做了文件的显示,并且用了按钮来实现,在每个按钮的点击事件上加上文件的读取方法,再将文件回填到界面即可,修改一律调用保存的方法,照例,上代码
fileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame.dispose();
//用来接收的字符串
StringBuilder result = new StringBuilder();
//获取文件内容
try {
//构造一个BufferedReader类来读取文件
BufferedReader br = new BufferedReader(new FileReader(new File(FilePath + name)));
String s = null;
//使用readLine方法,一次读一行
while((s = br.readLine())!=null){
result.append(System.lineSeparator()+s);
}
br.close();
}catch (Exception e1){
System.out.println("文件读取错误");
}
frame.dispose();
initNotbookMain(name,result.toString());
}
});
至此,我们的程序就写好了!你们学废了么!!!!
源码提取:关注回复“记事本程序”领取
本文地址:https://blog.csdn.net/qq_36978583/article/details/111912069