仿Windows记事本简要分析 (Java)
程序员文章站
2024-01-28 08:39:22
...
仿Windows记事本简要分析 (Java)
学Java的同学大部分都会做过一个小练习 ,用Java 做出一个记事本 。其中主要涉及的是界面和 io流 方面的知识 。
学完之后我在这做一个小总结,以下代码为部分练习代码,如果有错误或则可以改进的地方可以加我微信macforyou1。
记事本主要功能为存入文本和打开 ,在这里我的记事本需求为
1 菜单栏中包含文件,编辑,查看和帮助菜单
2 文件菜单中包括 新建,打开,保存,另存为,打印和退出功能
3 编辑菜单中具有的功能有撤销,重做,剪切,复制,删除,全选,以及查找和替换
4 查看菜单中具有的功能包括字体,颜 色等
5 ·帮助菜单中可以查看帮助文档
在这里我将这些逐步实现这些功能 一共做了四次改进
1.0 版本 界面可以运行成功
2.0版本 有打开和保存选项,为其添加功能
3.0版本 丰富界面
1.0版本 代码为
public class MynoteBook extends JFrame implements ActionListener {
JTextArea jta=null;
//菜单条
JMenuBar jmb=null;
JMenu jMenu=null;
public MynoteBook() {
//jta默认布局式border
jta=new JTextArea();
jmb=new JMenuBar();
jMenu=new JMenu("文件");
jMenu.setMnemonic('F');
jmb.add(jMenu);
this.setTitle("我的记事本");
this.add(jta);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,400);
this.setVisible(true);
}
public static void main(String[] args) {
MynoteBook m1=new MynoteBook();
}
@Override
public void actionPerformed(ActionEvent e) {
}
}
界面为 1.0版本运行成功 我们开始逐步添加子菜单 首先在文件选项中添加打开和保存
并且为其注册监听事件
界面为
2.0版本
其代码为
import java.io.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
* 我的记事本
* @author mac
*
*/
public class MynoteBook extends JFrame implements ActionListener {
JTextArea jta=null;
//菜单条
JMenuBar jmb=null;
JMenu jMenu=null;
JMenuItem jMenuItem1=null;
JMenuItem jMenuItem2=null;
//构造函数初始化
public MynoteBook() {
//jta默认布局式border
jta=new JTextArea();
jmb=new JMenuBar();
jMenu=new JMenu("文件");
jMenu.setMnemonic('F');
jMenuItem1=new JMenuItem("打开");
jMenuItem1.setActionCommand("open");
//打开 注册监听
jMenuItem1.addActionListener(this);
jMenuItem2=new JMenuItem("保存");
//保存 注册监听
jMenuItem2.addActionListener(this);
jMenuItem2.setActionCommand("save");
//加入menubar
this.setJMenuBar(jmb);
//把菜单翻入jmenubar
jmb.add(jMenu);
//把子菜单放入menu中
jMenu.add(jMenuItem1);
jMenu.add(jMenuItem2);
this.add(jta);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,400);
this.setVisible(true);
}
public static void main(String[] args) {
MynoteBook m1=new MynoteBook();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("open")) {
//point: JFileChooser
//创建一个文件选择对象
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("请选择文件");
jfc1.showOpenDialog(null);
jfc1.setVisible(true);
//得到用户选择的文件的全路径
String filename=jfc1.getSelectedFile().getAbsolutePath();
System.out.println(filename);
//使用bufferreader 来进行文件的输入输出
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader(filename);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
br=new BufferedReader(fr);
//将得到的文件内容显示在记事本上面
//输出到记事本上面
String string="";
String allString="";
try {
while((string=br.readLine())!=null){
allString+=string;
jta.setText(allString);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//输出到记事本上面之后千万不要忘记
try {
br.close();
fr.close();
} catch (Exception e2) {
// TODO: handle exception
}
}else if (e.getActionCommand().equals("save")) {
//创建一个文件选择对象
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("另存为");
jfc1.showSaveDialog(null);
jfc1.setVisible(true);
//得到用户希望把文件保存在何处,文件全文件
String file=jfc1.getSelectedFile().getAbsolutePath();
//准备写入到指定文件
FileWriter fw=null;
BufferedWriter bw=null;
try {
fw=new FileWriter(file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
bw=new BufferedWriter(fw);
try {
bw.write(this.jta.getText());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
try {
bw.close();
fw.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
}
其中的难点为 实现打开和保存功能,我们无需再自己设计界面,只需调用JFileChooser 其中我们可以发现JFileChooser主要功能就是出现打开和保存功能
但是打开和保存功能是需要我们自己实现的,在这里我们使用io流中的字符流,因为使用字节流输入输出太慢,同时如果使用字节流的话,读入文件可能造成所有文件都在一行,造成格式的混乱,使用字符流,实现逐行的读入,符合产品需求
3.0版本
import java.io.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
* 我的记事本
* @author mac
*
*/
public class MynoteBook extends JFrame implements ActionListener {
JTextArea jta=null;
//菜单条
JMenuBar jmb=null;
JMenu jMenu=null;
JMenu jMenu2=null;
JMenu jMenu3=null;
JMenu jMenu4=null;
JMenuItem jMenuItem1=null;
JMenuItem jMenuItem2=null;
JMenuItem jMenuItem3=null;
JMenuItem jMenuItem4=null;
JMenuItem jMenuItem5=null;
JMenuItem jMenuItem6=null;
JMenuItem jMenuItem7=null;
JMenuItem jMenuItem8=null;
//构造函数初始化
public MynoteBook() {
//jta默认布局式border
jta=new JTextArea();
jmb=new JMenuBar();
jMenu=new JMenu("文件");
jMenu.setMnemonic('F');
jMenu2=new JMenu("编辑");
jMenu2.setMnemonic('E');
jMenu3=new JMenu("查看");
jMenu3.setMnemonic('L');
jMenu4=new JMenu("帮助");
jMenu4.setMnemonic('H');
jMenuItem1=new JMenuItem("打开");
jMenuItem1.setActionCommand("open");
//打开 注册监听
jMenuItem1.addActionListener(this);
jMenuItem2=new JMenuItem("保存");
//保存 注册监听
jMenuItem2.addActionListener(this);
jMenuItem2.setActionCommand("save");
jMenuItem3=new JMenuItem("复制");
jMenuItem3.setActionCommand("copy");
//打开 注册监听
jMenuItem3.addActionListener(this);
jMenuItem4=new JMenuItem("粘贴");
jMenuItem4.setActionCommand("paste");
//打开 注册监听
jMenuItem4.addActionListener(this);
jMenuItem5=new JMenuItem("字体");
jMenuItem5.setActionCommand("font");
//打开 注册监听
jMenuItem5.addActionListener(this);
jMenuItem6=new JMenuItem("颜色");
jMenuItem6.setActionCommand("color");
//打开 注册监听
jMenuItem6.addActionListener(this);
jMenuItem7=new JMenuItem("帮助文档");
jMenuItem7.setActionCommand("help");
//打开 注册监听
jMenuItem7.addActionListener(this);
jMenuItem8=new JMenuItem("版本");
jMenuItem8.setActionCommand("version");
//打开 注册监听
jMenuItem8.addActionListener(this);
//把子菜单放入menu中
jMenu.add(jMenuItem1);
jMenu.add(jMenuItem2);
jMenu2.add(jMenuItem3);
jMenu2.add(jMenuItem4);
jMenu3.add(jMenuItem5);
jMenu3.add(jMenuItem6);
jMenu4.add(jMenuItem7);
jMenu4.add(jMenuItem8);
//设置menubar
this.setJMenuBar(jmb);
//把菜单翻入jmenubar
jmb.add(jMenu);
jmb.add(jMenu2);
jmb.add(jMenu3);
jmb.add(jMenu4);
this.setTitle("我的记事本");
this.add(jta);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(300,400);
this.setVisible(true);
}
public static void main(String[] args) {
MynoteBook m1=new MynoteBook();
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("open")) {
//point: JFileChooser
//创建一个文件选择对象
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("请选择文件");
jfc1.showOpenDialog(null);
jfc1.setVisible(true);
//得到用户选择的文件的全路径
String filename=jfc1.getSelectedFile().getAbsolutePath();
System.out.println(filename);
//使用bufferreader 来进行文件的输入输出
FileReader fr=null;
BufferedReader br=null;
try {
fr=new FileReader(filename);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
br=new BufferedReader(fr);
//将得到的文件内容显示在记事本上面
//输出到记事本上面
String string="";
String allString="";
try {
while((string=br.readLine())!=null){
allString+=string;
jta.setText(allString);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//输出到记事本上面之后千万不要忘记
try {
br.close();
fr.close();
} catch (Exception e2) {
// TODO: handle exception
}
}else if (e.getActionCommand().equals("save")) {
//创建一个文件选择对象
JFileChooser jfc1=new JFileChooser();
jfc1.setDialogTitle("另存为");
jfc1.showSaveDialog(null);
jfc1.setVisible(true);
//得到用户希望把文件保存在何处,文件全文件
String file=jfc1.getSelectedFile().getAbsolutePath();
//准备写入到指定文件
FileWriter fw=null;
BufferedWriter bw=null;
try {
fw=new FileWriter(file);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
bw=new BufferedWriter(fw);
try {
bw.write(this.jta.getText());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
try {
bw.close();
fw.close();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
}
然后我们再逐步添加之后的功能,只需复制粘贴源代码即可 ,
将所有的组件添加完成后,outline可以很清楚的看到所需组件和实现,再对代码改进十分简单方便
以上为记事本功能的基本实现,之后复制粘贴功能实现的代码,我将在下节展示