只实现了 新建、打开、保存、退出功能
package test5;
import java.awt.EventQueue;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JScrollBar;
import java.awt.BorderLayout;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.awt.event.ActionEvent;
public class Notepad {
private JFrame frame;
private String oldText = "";// 用来保存旧的文本,便于比较文本是否改动
private boolean isNewFile = true;// 是否是新文件
private File currentFile;// 当前文件
private String filepath;// 获取文件路径
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Notepad window = new Notepad();
window.frame.setSize(1000,800);
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Notepad() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setTitle("无标题-记事本");
JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
JTextArea textArea = new JTextArea();
scrollPane.setViewportView(textArea);
JMenuBar menuBar = new JMenuBar();
scrollPane.setColumnHeaderView(menuBar);
JMenu mnNewMenu_file = new JMenu("\u6587\u4EF6(F)");
menuBar.add(mnNewMenu_file);
// 新建
JMenuItem newfile = new JMenuItem("\u65B0\u5EFA(N)");
newfile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
textArea.requestFocus();
// 标签用于指定屏幕内的焦点View。
String currentText = textArea.getText();
// 比较文本是否发生改变
boolean isTextChanged = currentText.equals(oldText) ? false : true;
if (isTextChanged) {
// 保留选择的结果,为后面的结果处理做准备
int savechoose = JOptionPane.showConfirmDialog(null, "您的文件未保存,是否需要保存?", "提示",
JOptionPane.YES_NO_CANCEL_OPTION);
if (savechoose == JOptionPane.YES_OPTION) {
JFileChooser jfc = new JFileChooser();
// 设置文件选择为全选
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
// 设置对话框标题
jfc.setDialogTitle("另存为");
// 文件保存对话框
int result = jfc.showSaveDialog(null);
// 取消操作直接return
if (result == JFileChooser.CANCEL_OPTION)
return;
// else ...返回选中的文件
File saveFile = jfc.getSelectedFile();
// 检查文件名是否合法
// 如果不合法
if (saveFile == null || saveFile.getName().equals("")) {
JOptionPane.showMessageDialog(null, "文件名不合法", "文件名不合法", JOptionPane.ERROR_MESSAGE);
} else {
// 合法:文本读入文件
try {
// 文件写入
FileWriter fw = new FileWriter(saveFile);
// 文件封装
BufferedWriter bw = new BufferedWriter(fw);
// 写入文件
bw.write(textArea.getText(), 0, textArea.getText().length());
// 刷新 -- 关闭
bw.flush();
bw.close();
// 保存了该文件,代表该文件是一个新文件
isNewFile = true;
// 获取文件呢路径名字
filepath = saveFile.getPath();
// 如果文件后缀名不是txt,则改为txt
if (!filepath.toUpperCase().endsWith("TXT")) {
filepath += ".txt";
File newfile = new File(filepath);
saveFile.renameTo(newfile);
}
// 当前文件即为保存的文件
currentFile = saveFile;
// frame.setTitle(saveFile.getName()+"记事本");
oldText = textArea.getText();
} catch (Exception e2) {
// TODO: handle exception
}
}
} else if (savechoose == JOptionPane.NO_OPTION) {
// 如果不保存,直接清空文本
textArea.setText("");
isNewFile = true;
oldText = textArea.getText();
} else if (savechoose == JOptionPane.CANCEL_OPTION) {
// 取消操作什么也不做
return;
}
} else {
// 文本没有改变,代表这是一个新文件
isNewFile = true;
}
}
});
mnNewMenu_file.add(newfile);
// 打开
JMenuItem openfile = new JMenuItem("\u6253\u5F00(O)");
openfile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String currentText = textArea.getText();
// 比较文本是否发生改变
isNewFile = false;
boolean isTextChanged = currentText.equals(oldText) ? false : true;
if (isTextChanged) {
// 保留选择的结果,为后面的结果处理做准备
int savechoose = JOptionPane.showConfirmDialog(null, "您的文件未保存,是否需要保存?", "提示",
JOptionPane.YES_NO_CANCEL_OPTION);
if (savechoose == JOptionPane.YES_OPTION) {
JFileChooser jfc = new JFileChooser();
// 设置文件选择为全选
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
// 设置对话框标题
jfc.setDialogTitle("另存为");
// 文件保存对话框
int result = jfc.showSaveDialog(null);
// 取消操作直接return
if (result == JFileChooser.CANCEL_OPTION)
return;
// else ...返回选中的文件
File saveFile = jfc.getSelectedFile();
// 检查文件名是否合法
// 如果不合法
if (saveFile == null || saveFile.getName().equals("")) {
JOptionPane.showMessageDialog(null, "文件名不合法", "文件名不合法", JOptionPane.ERROR_MESSAGE);
} else {
// 合法:文本读入文件
try {
// 文件写入
FileWriter fw = new FileWriter(saveFile);
// 文件封装
BufferedWriter bw = new BufferedWriter(fw);
// 写入文件
bw.write(textArea.getText(), 0, textArea.getText().length());
// 刷新 -- 关闭
bw.flush();
bw.close();
// 打开了该文件,代表该文件不是一个新文件
// isNewFile = false;
// 当前文件即为保存的文件
currentFile = saveFile;
// frame.setTitle(saveFile.getName()+"记事本");
oldText = textArea.getText();
} catch (Exception e2) {
// TODO: handle exception
}
}
} else if (savechoose == JOptionPane.NO_OPTION) {
// 如果不保存,直接清空文本
textArea.setText("");
isNewFile = true;
oldText = textArea.getText();
} else if (savechoose == JOptionPane.CANCEL_OPTION) {
// 取消操作什么也不做
return;
}
} else {
// 打开文件
JFileChooser jfc = new JFileChooser();
jfc.setDialogTitle("打开文件");
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result = jfc.showOpenDialog(null);
if (result == JFileChooser.CANCEL_OPTION)
return;
File openfile = jfc.getSelectedFile();
if (openfile == null || openfile.getName().equals("")) {
JOptionPane.showMessageDialog(null, "不合法的文件名", "不合法的文件名", JOptionPane.ERROR_MESSAGE);
} else {
// 文件读出操作
try {
FileReader fr = new FileReader(openfile);
BufferedReader bfr = new BufferedReader(fr);
// 按行读出
String str;
while ((str = bfr.readLine()) != null) {
textArea.append(str);
}
bfr.close();
fr.close();
// isNewFile = true;
currentFile = openfile;
oldText = textArea.getText();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
}
});
mnNewMenu_file.add(openfile);
// 保存
JMenuItem save = new JMenuItem("\u4FDD\u5B58(S)");
save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (isNewFile) {
JFileChooser jfc = new JFileChooser();
jfc.setDialogTitle("保存到");
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
int result = jfc.showSaveDialog(null);
if (result == JFileChooser.CANCEL_OPTION) {
return;
} else {
File savefile = jfc.getSelectedFile();
FileWriter fw;
try {
fw = new FileWriter(savefile);
BufferedWriter bfw = new BufferedWriter(fw);
bfw.write(textArea.getText(), 0, textArea.getText().length());
bfw.flush();
bfw.close();
// 由于是将新文件保存了,所以该文件不是新文件了
isNewFile = false;
currentFile = savefile;
oldText = textArea.getText();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} else {
try {
FileWriter fw = new FileWriter(currentFile);
BufferedWriter bfw = new BufferedWriter(fw);
bfw.write(textArea.getText(), 0, textArea.getText().length());
bfw.flush();
fw.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
});
mnNewMenu_file.add(save);
//退出
JMenuItem exit = new JMenuItem("\u9000\u51FA(X)");
exit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String currentText = textArea.getText();
boolean isTextChanged = currentText.equals(oldText) ? false : true;
if (isTextChanged) {
int resul = JOptionPane.showConfirmDialog(null, "文件未保存,是否保存?", "提示", JOptionPane.OK_CANCEL_OPTION);
if (resul == JOptionPane.OK_OPTION) {
JFileChooser jfc = new JFileChooser();
// 设置文件选择为全选
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
// 设置对话框标题
jfc.setDialogTitle("另存为");
// 文件保存对话框
int result = jfc.showSaveDialog(null);
// 取消操作直接return
if (result == JFileChooser.CANCEL_OPTION)
return;
// else ...返回选中的文件
File saveFile = jfc.getSelectedFile();
// 检查文件名是否合法
// 如果不合法
if (saveFile == null || saveFile.getName().equals("")) {
JOptionPane.showMessageDialog(null, "文件名不合法", "文件名不合法", JOptionPane.ERROR_MESSAGE);
} else {
// 合法:文本读入文件
try {
// 文件写入
FileWriter fw = new FileWriter(saveFile);
// 文件封装
BufferedWriter bw = new BufferedWriter(fw);
// 写入文件
bw.write(textArea.getText(), 0, textArea.getText().length());
// 刷新 -- 关闭
bw.flush();
bw.close();
// 打开了该文件,代表该文件不是一个新文件
// isNewFile = false;
// 当前文件即为保存的文件
currentFile = saveFile;
// frame.setTitle(saveFile.getName()+"记事本");
oldText = textArea.getText();
} catch (Exception e2) {
// TODO: handle exception
}
}
}
else System.exit(0);
} else {
int resu = JOptionPane.showConfirmDialog(null, "确定要退出?","提示",JOptionPane.OK_CANCEL_OPTION);
if(resu == JOptionPane.OK_OPTION) System.exit(0);
else System.exit(0);
}
}
});
mnNewMenu_file.add(exit);
JMenu mnNewMenu_edit = new JMenu("\u7F16\u8F91(E)");
menuBar.add(mnNewMenu_edit);
JMenu mnNewMenu_format = new JMenu("\u683C\u5F0F(O)");
menuBar.add(mnNewMenu_format);
JMenu mnNewMenu_view = new JMenu("\u67E5\u770B(V)");
menuBar.add(mnNewMenu_view);
JMenu mnNewMenu_help = new JMenu("\u5E2E\u52A9(H)");
menuBar.add(mnNewMenu_help);
}
}
由于有代码耦合,比如新建(在文本改变的情况下)、打开(在文本改变的情况下)、保存,都要实现保存功能,所以,将它用一个函数代替。这样降低了代码的耦合。(这里我并没有实现退出功能,可以参考上面的,)如下:
package practice4;
import java.awt.EventQueue;
import java.awt.TextArea;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import java.awt.BorderLayout;
import javax.swing.JTextArea;
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 java.nio.channels.ShutdownChannelGroupException;
import java.awt.event.ActionEvent;
public class Notepad {
private JFrame frame;
private boolean isNewFile = true;
//文本是否发生变动
private String oldText = "";
private String currentText ;
private JTextArea textArea;
private boolean isChange = false;
private File savefile;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Notepad window = new Notepad();
window.frame.setSize(500, 400);
window.frame.setTitle("Notepad");
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public Notepad() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void Save() {
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
jfc.setDialogTitle("另存为");
int res = jfc.showSaveDialog(null);
//设置文件选择模式-->生成保存文件对话框-->设置对话框标题
//取消
if(res == JFileChooser.CANCEL_OPTION) return;
//选择文件
savefile = jfc.getSelectedFile();
//检查文件名是否合法
if(savefile.getName() == null || savefile.getName().equals("")) {
JOptionPane.showMessageDialog(null, "文件名不合法,请重新输入", "警告",JOptionPane.ERROR_MESSAGE);
}
//否则,写入文件
else {
try {
FileWriter fw = new FileWriter(savefile);
BufferedWriter bw = new BufferedWriter(fw) ;
bw.write(textArea.getText());
bw.flush();
bw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private void initialize() {
frame = new JFrame();
frame.setBounds(100, 100, 450, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
JMenu File = new JMenu("File");
menuBar.add(File);
JMenuItem NewFile = new JMenuItem("New File");
//新建文件
NewFile.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentText = textArea.getText();
isChange = currentText.equals(oldText) ? false : true;
if(isChange) {
int savechoose = JOptionPane.showConfirmDialog(null, "您的文件未保存,是否保存?","提示",JOptionPane.YES_NO_CANCEL_OPTION);
//取消新建
if(savechoose == JOptionPane.CANCEL_OPTION) return;
//不保存
if(savechoose == JOptionPane.NO_OPTION) {
//清空文本,是一个新文件
textArea.setText("");
isNewFile = true;
}
//旧的文本将要保存到文件夹
else {
Save();
}
}
}
});
File.add(NewFile);
JMenuItem mntmOpen = new JMenuItem("Open");
//Open file
mntmOpen.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
currentText = textArea.getText();
isChange = currentText.equals(oldText) ? false : true;
//如果文本发生变化,询问是否保存
if(isChange) {
int savechoose = JOptionPane.showConfirmDialog(null, "文件未保存,是否保存?","提示",JOptionPane.YES_NO_OPTION);
if(savechoose == JOptionPane.NO_OPTION) {
textArea.setText("");
}
else {
Save();
}
}
//打开文件
JFileChooser jfc = new JFileChooser();
int res = jfc.showOpenDialog(null);
if(res == JFileChooser.CANCEL_OPTION) return;
//打开文件
File currentFile = jfc.getSelectedFile();
FileReader fr;
try {
fr = new FileReader(currentFile);
BufferedReader br = new BufferedReader(fr);
String str;
try {
while((str = br.readLine())!=null) {
textArea.append(str);
}
br.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
File.add(mntmOpen);
//保存
JMenuItem Save = new JMenuItem("Save");
Save.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Save();
}
});
File.add(Save);
JMenuItem Exit = new JMenuItem("Exit");
File.add(Exit);
JMenu Edit = new JMenu("Edit");
menuBar.add(Edit);
JMenuItem Copy = new JMenuItem("Copy");
Edit.add(Copy);
JMenuItem Paste = new JMenuItem("Paste");
Edit.add(Paste);
JMenuItem Cut = new JMenuItem("Cut");
Edit.add(Cut);
JScrollPane scrollPane = new JScrollPane();
frame.getContentPane().add(scrollPane, BorderLayout.CENTER);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
}
}