java记事本

只实现了 新建、打开、保存、退出功能

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);
	}

}

猜你喜欢

转载自blog.csdn.net/qq_40883132/article/details/80737132