swing自制记事本

package com.hcqm.software;


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


import javax.swing.JComponent;
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.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.border.EmptyBorder;


public class Notepad extends JFrame {


	/**
	 * 功能:记事本能打开保存(快捷键)、保存(快捷键)、另存为 点击关闭的时候如果没有保存则提示是否需要保存
	 *
	 * 存在的bug:另存为的时候没有显示默认的名字
	 */
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private File file = new File("新建文件.txt");
	private JTextArea text = null;
	private boolean isSave = true;


	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Notepad frame = new Notepad();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}


	/**
	 * Create the frame.
	 */
	public Notepad() {
		text = new JTextArea();


		this.addWindowListener(new WindowAdapter() {


			@Override
			public void windowClosing(WindowEvent e) {
				// TODO Auto-generated method stub
				super.windowClosing(e);
				if (isSave) {
					int s = JOptionPane.showConfirmDialog(null, "保存?");
					if (s == 0) {
						sSave();
					}
					System.exit(0);
				}
			}


		});


		// 添加快捷键方法一:registerKeyboardAction
		// 打开快捷键
		// text.registerKeyboardAction(new ActionListener() {
		// @Override
		// public void actionPerformed(ActionEvent e) {
		// oSave();
		// }
		// }, KeyStroke.getKeyStroke(KeyEvent.VK_O, InputEvent.CTRL_DOWN_MASK),
		// JComponent.WHEN_IN_FOCUSED_WINDOW);


		// 保存快捷键
		// 如果沒有打开过文件则另存为,否则保存就行
		// text.registerKeyboardAction(new ActionListener() {
		// @Override
		// public void actionPerformed(ActionEvent e) {
		// sSave();
		// }
		// }, KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_DOWN_MASK),
		// JComponent.WHEN_IN_FOCUSED_WINDOW);


		// 添加快捷键方法二
		text.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				super.keyPressed(e);
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_O) {
					oSave();
				}
			}


		});


		text.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				super.keyPressed(e);
				if (e.isControlDown() && e.getKeyCode() == KeyEvent.VK_S) {
					sSave();
				}
			}
		});


		setIconImage(Toolkit.getDefaultToolkit().getImage("src\\resources\\images\\1.png"));
		setBackground(new Color(0, 255, 255));
		setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 14));
		setForeground(Color.RED);
		setTitle("Notepad");
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		setBounds(100, 100, 924, 637);


		JMenuBar menuBar = new JMenuBar();
		menuBar.setForeground(new Color(0, 0, 0));
		menuBar.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		setJMenuBar(menuBar);


		JMenu mnf = new JMenu("文件(F)");
		mnf.setForeground(new Color(0, 0, 0));
		mnf.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		menuBar.add(mnf);


		JMenuItem open = new JMenuItem("打开(O)...          Ctrl+O");
		open.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fc = new JFileChooser();
				fc.showOpenDialog(null);
				File theFile = fc.getSelectedFile();
				file = theFile;
				// 把文件内容读取到text中
				StringBuilder sb = new StringBuilder();
				getMessage(file, sb);
				text.setText(sb.toString());
			}
		});


		open.setForeground(new Color(0, 0, 0));
		open.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		mnf.add(open);


		JMenuItem save = new JMenuItem("保存(S)             Ctrl+S");
		save.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				save(file.getPath(), text.getText());
			}
		});
		save.setForeground(new Color(0, 0, 0));
		save.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		mnf.add(save);


		JMenuItem saveAs = new JMenuItem("另存为(A)...");
		saveAs.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				JFileChooser fc = new JFileChooser();
				fc.showSaveDialog(null);
				String saveAsPath = fc.getSelectedFile().getAbsolutePath();
				save(saveAsPath, text.getText());
			}
		});
		saveAs.setForeground(new Color(0, 0, 0));
		saveAs.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		mnf.add(saveAs);


		JMenu mne = new JMenu("编辑(E)");
		mne.setForeground(new Color(0, 0, 0));
		mne.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		menuBar.add(mne);


		JMenu mno = new JMenu("格式(O)");
		mno.setForeground(new Color(0, 0, 0));
		mno.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		menuBar.add(mno);


		JMenu mnv = new JMenu("查看(V)");
		mnv.setForeground(new Color(0, 0, 0));
		mnv.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		menuBar.add(mnv);


		JMenu mnh = new JMenu("帮助(H)");
		mnh.setForeground(new Color(0, 0, 0));
		mnh.setFont(new Font("Microsoft YaHei UI Light", Font.PLAIN, 20));
		menuBar.add(mnh);
		contentPane = new JPanel();
		contentPane.setForeground(new Color(255, 0, 51));
		contentPane.setBackground(new Color(255, 204, 255));
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));


		// 注意:滚动条应该添加在包裹JTextArea的容器上,而不是添加到JTextArea本身上面
		JScrollPane scrollPane = new JScrollPane();
		contentPane.add(scrollPane, BorderLayout.CENTER);
		scrollPane.setViewportView(text);
		text.setWrapStyleWord(true);
		text.setLineWrap(true);
		text.setFont(new Font("Microsoft YaHei UI Light", Font.BOLD, 22));
	}


	protected void oSave() {
		JFileChooser fc = new JFileChooser();
		fc.showOpenDialog(null);
		File theFile = fc.getSelectedFile();
		if (theFile != null) {
			file = theFile;
			// 把文件内容读取到text中
			StringBuilder sb = new StringBuilder();
			getMessage(file, sb);
			text.setText(sb.toString());
		}
	}


	protected void sSave() {
		if (file.getName().equals("新建文件.txt")) {
			JFileChooser fc = new JFileChooser();
			fc.showSaveDialog(null);
			File ff = fc.getSelectedFile();
			if (ff != null) {
				String saveAsPath = fc.getSelectedFile().getAbsolutePath();
				save(saveAsPath, text.getText());
			}
		} else {
			save(file.getPath(), text.getText());
		}
	}


	protected void save(String filePath2, String text) {
		OutputStreamWriter osw = null;
		try {
			osw = new OutputStreamWriter(new BufferedOutputStream(new FileOutputStream(filePath2)), "utf-8");
			osw.write(text);
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				osw.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		// 当有内容保存时改变变量
		isSave = false;
	}


	protected void getMessage(File file, StringBuilder sb) {
		InputStreamReader bis = null;
		try {
			bis = new InputStreamReader(new BufferedInputStream(new FileInputStream(file)), "utf-8");
			char[] c = new char[100];
			int len = 0;
			while ((len = bis.read(c)) != -1) {
				sb.append(c, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				bis.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
注意:在这里类似与JMenuBar和JMunuItem添加的点击事件只能是actionListner,而不能是mouseClicked!这里是什么原因,具体我也不知...

猜你喜欢

转载自blog.csdn.net/qq_32182637/article/details/79183240