需求分析
实现一个记事本,工具栏使用Menu
菜单实现;可新建、保存和打开文件。
界面如下图所示:
代码实现
TextEditor
类
import java.awt.BorderLayout;
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.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
//新建 打开 保存
public class TextEditor{
private JFrame frame;//整体框架
private JTextArea textArea=null;
public TextEditor() {
frame=new JFrame("记事本-Version01");
frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
frame.setBounds(260,100,500,500);//设置大小
JMenuBar menuBar=new JMenuBar();//菜单条
textArea=new JTextArea();//多行文本输入
frame.add(textArea,BorderLayout.CENTER);//Border布局
textArea.setLineWrap(true);//自动到达指定宽度换行
JMenu file_Menu=new JMenu("文件");//菜单
file_Menu.setMnemonic(1);//助记符
JMenu edit_Menu=new JMenu("编辑");
JMenuItem save_JMenuItem=new JMenuItem("新建");
save_JMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
newFile();//添加点击事件
}
});
JMenuItem open_JMenuItem=new JMenuItem("打开");
open_JMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
openFile();
}
});
JMenuItem new_JMenuItem=new JMenuItem("保存");
new_JMenuItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
saveFile();
}
});
JMenuItem copy_JMenuItem=new JMenuItem("复制");
JMenuItem paste_JMenuItem=new JMenuItem("粘贴");
JMenuItem slice_JMenuItem=new JMenuItem("剪切");
file_Menu.add(new_JMenuItem);
file_Menu.add(save_JMenuItem);
file_Menu.add(open_JMenuItem);
menuBar.add(file_Menu);
edit_Menu.add(copy_JMenuItem);
edit_Menu.add(paste_JMenuItem);
edit_Menu.add(slice_JMenuItem);
menuBar.add(edit_Menu);
frame.setJMenuBar(menuBar);
frame.setVisible(true);
}
private void newFile() {
System.out.println("new file");
// 选择保存或取消
if(textArea.getText().equals("")) {//判断文本域有无内容
frame.setTitle("无标题-记事本");
}else {
}
}
private void saveFile() {
System.out.println("save file");
JFileChooser fileChooser=new JFileChooser();
//文件导航窗口
fileChooser.setDialogTitle("另存为……");
// 按默认的方式显示
fileChooser.showSaveDialog(null);
fileChooser.setVisible(true);
// 得到用户希望保存文件的路径
String filePathString=fileChooser.getSelectedFile().getAbsolutePath();
// 准备写入到指定文件
FileWriter fileWriter=null;
BufferedWriter bufferedWriter=null;
try {
fileWriter=new FileWriter(filePathString);
bufferedWriter=new BufferedWriter(fileWriter);
bufferedWriter.write(textArea.getText());
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally {
try {
bufferedWriter.close();
fileWriter.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
private void openFile() {
System.out.println("open file");
JFileChooser chooser=new JFileChooser();//文件导航窗口
chooser.setDialogTitle("请选择文件……");
chooser.showOpenDialog(null);//使用默认方式
chooser.setVisible(true);
// 判断是否选择了文件
if(chooser.getSelectedFile()==null) {
return;
}
// 得到用户选择文件的路径
String filenameString=chooser.getSelectedFile().getAbsolutePath();
FileReader fileReader=null;
BufferedReader bufferedReader=null;
try {
fileReader=new FileReader(filenameString);
bufferedReader=new BufferedReader(fileReader);
// 从文件中读取信息并显示到textArea
String string="";
String allConString="";
try {
while((string=bufferedReader.readLine())!=null) {
allConString+=string+"\r\n";
}
// 放在TextArea上
textArea.setText(allConString);
} catch (IOException e1) {
e1.printStackTrace();
}finally {
try {
bufferedReader.close();
fileReader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
public static void main(String[] args) {
new TextEditor();
}
}
实验总结
JFileChooser
不是抽象类也不是接口,因此可以实例化一个对象File getSelectedFile()
,File[] getSelectedFiles()
该方法用于获取打开或保存的文件。Java
文件的读写操作,利用字符流或是字节流进行写入读出- 细节之处,记得
try/catch
一下,使代码更简洁可以可以适当提取出函数