只实现了 新建、打开、保存、退出功能
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); } }