天天看點

Java實作記事本功能:JNotePad

學習swing不久,想寫個記事本,才疏學淺,請多指教。

目前實作了建立、打開、儲存、複制粘貼的基本功能,查找替換等功能日後再實作吧,java的String類應該可以幫上忙,調用下API就行了吧。

package notepad;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Scanner;
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.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.filechooser.FileNameExtensionFilter;

public class Main extends JFrame {
	private JTextArea jta = new JTextArea();
	private JScrollPane jsp = new JScrollPane(jta);// 建立滾動文本框
	private JMenuBar jmb = new JMenuBar();
	private JMenu jm1 = new JMenu("File");
	private JMenu jm2 = new JMenu("Edit");
	private JMenu jm3=new JMenu("Help");
	private JMenuItem newFile = new JMenuItem("New");
	private JMenuItem openFile = new JMenuItem("Open");
	private JMenuItem saveFile = new JMenuItem("Save");
	private JMenuItem saveFileAs = new JMenuItem("SaveAs");
	private JMenuItem exit = new JMenuItem("Exit");
	private JPopupMenu jpm = new JPopupMenu();
	private JMenuItem copy = new JMenuItem("Copy");
	private JMenuItem paste = new JMenuItem("Paste");
	private JMenuItem cut = new JMenuItem("Cut");
	private JMenuItem version =new JMenuItem("Version");
	private String tmp = "";
	private String address = "";
	private boolean modified = false;

	public Main() {
		setLayout(new BorderLayout());
		
		/*
		 * 建立右鍵菜單
		 */
		jpm.add(copy);
		jpm.add(paste);
		jpm.add(cut);
		copy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!jta.getSelectedText().equals("")) {
					modified = true;
					jta.copy();
				}
			}
		});
		paste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				jta.paste();
				modified = true;
			}
		});
		cut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!jta.getSelectedText().equals("")) {
					modified = true;
					jta.cut();
				}
			}
		});
		
		/*
		 * 菜單欄
		 */
		
		//File
		jm1.add(newFile);
		jm1.add(openFile);
		jm1.add(saveFile);
		jm1.add(saveFileAs);
		jm1.add(exit);
		newFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				jta.setText("");
				modified = false;
			}
		});
		openFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				/*
				 * 檔案選擇器
				 */
				JFileChooser chooser = new JFileChooser();
				FileNameExtensionFilter filter = new FileNameExtensionFilter(
						"文本文檔", "txt");// 過濾器
				chooser.setFileFilter(filter);
				int returnVal = chooser.showOpenDialog(getParent());
				if (returnVal == JFileChooser.APPROVE_OPTION) {// 如果點選取消則不會産生異常
					address = chooser.getSelectedFile().getAbsolutePath();
					try {
						Scanner sin = new Scanner(chooser.getSelectedFile());
						StringBuffer sb = new StringBuffer();
						while (sin.hasNextLine())
							sb.append(sin.nextLine());
						sin.close();
						jta.setText(sb.toString());
					} catch (FileNotFoundException e) {
						JOptionPane.showMessageDialog(null, "FileNotFound!");
					}
				}
				modified = false;
			}
		});
		saveFile.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (saveFile(address, jta.getText()))
					modified = false;
			}
		});
		saveFileAs.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (saveFile("", jta.getText()))
					modified = false;
			}
		});
		exit.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (!modified)
					System.exit(0);
				else {
					int sav = JOptionPane.showConfirmDialog(null,
							"You have modified the text!\nSave Or Not?");
					switch (sav) {
					case JOptionPane.OK_OPTION:
						saveFile(address, jta.getText());
						System.exit(0);
					case JOptionPane.NO_OPTION:
						System.exit(0);
					default:
					}
				}
			}
		});
		
		//Edit
		jm2.add(copy);
		jm2.add(paste);
		jm2.add(cut);
		
		//Help
		jm3.add(version);
		version.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(null, "JNotePad\n"
						+ "作者:獨孤九劍\n"
						+ "版本:1.0\n"
						+ "感想:求知欲是治愈無聊的良方,求知欲本身無藥可治。");
			}
		});
		
		jmb.add(jm1);
		jmb.add(jm2);
		jmb.add(jm3);
		add(jmb, BorderLayout.NORTH);

		/*
		 * 建立具有滾動、自動換行功能的文本框
		 */
		jta.setLineWrap(true);// 自動換行
		jta.setWrapStyleWord(true);// 對單詞自動換行
		add(jsp, BorderLayout.CENTER);
		jta.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent arg0) {
				if (arg0.getButton() == MouseEvent.BUTTON3)// 左中右鍵分别是BUTTON1、2、3
					jpm.show(jta, arg0.getX(), arg0.getY());
			}
		});
		jta.addKeyListener(new KeyAdapter() {
			public void keyReleased(KeyEvent e) {
				modified = true;
			}
		});
	}

	public static boolean saveFile(String address, String text) {
		// 若不存在,則建立
		if (address.equals("")) {
			JFileChooser chooser = new JFileChooser();
			FileNameExtensionFilter filter = new FileNameExtensionFilter(
					"文本文檔", "txt");// 過濾器
			chooser.setFileFilter(filter);
			int returnVal = chooser.showOpenDialog(null);
			if (returnVal == JFileChooser.APPROVE_OPTION) {// 如果點選取消則不會産生異常
				// 如果目前是文本格式儲存,并且沒有txt字尾則自動添加
				address = chooser.getSelectedFile().getAbsolutePath();
				if ((!address.endsWith(".txt"))
						&& (chooser.getFileFilter() == filter))
					address += ".txt";
			} else
				return false;
		}
		// 儲存
		try {
			PrintWriter pw = new PrintWriter(new File(address));
			pw.println(text);
			pw.close();
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, "FileNotFound!");
			return false;
		}
		return true;
	}

	public static void main(String[] args) {
		Main main = new Main();
		main.setSize(600, 400);
		main.setLocationRelativeTo(null);
		main.setVisible(true);
		main.setTitle("NotePad");
		main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}