【J2SE】java仿windows记事本

基于J2SE实现的一个记事本程序。

运行程序截图:



工程目录结构:



程序代码:

package com.hblg;

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class NotePad extends JFrame implements ActionListener, ItemListener {
	static JTextArea ta;
	JMenuBar mb;
	FileDialog dialog_load, dialog_save;
	JMenu mFile, mEdit, mForm, mCheck, mHelp;
	JMenuItem open, save, exit, copy, cut, paste, search, about;
	JCheckBoxMenuItem lineWrap, state;
	FileReader fr;
	BufferedReader br;
	FileWriter fw;
	BufferedWriter bw;
	JLabel label = new JLabel("", JLabel.RIGHT);

	String copyString;

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 设置界面风格
		try {
			UIManager
					.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
			// SwingUtilities.updateComponentTreeUI(this);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UnsupportedLookAndFeelException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		new NotePad();
	}

	public NotePad() {
		dialog_load = new FileDialog(this, "打开文件对话框", FileDialog.LOAD);
		dialog_save = new FileDialog(this, "保存文件对话框", FileDialog.SAVE);
		open = new JMenuItem("打开");
		save = new JMenuItem("保存");
		exit = new JMenuItem("退出");
		copy = new JMenuItem("复制");
		cut = new JMenuItem("剪切");
		paste = new JMenuItem("粘贴");
		search = new JMenuItem("查找");
		about = new JMenuItem("关于");
		lineWrap = new JCheckBoxMenuItem("自动换行");
		state = new JCheckBoxMenuItem("状态栏");
		save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
				ActionEvent.CTRL_MASK));
		copy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
				ActionEvent.CTRL_MASK));
		cut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
				ActionEvent.CTRL_MASK));
		paste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
				ActionEvent.CTRL_MASK));
		mFile = new JMenu("文件(F)");
		mFile.setMnemonic(KeyEvent.VK_F);
		mEdit = new JMenu("编辑(E)");
		mForm = new JMenu("格式(O)");
		mCheck = new JMenu("查找(V)", true);
		mHelp = new JMenu("帮助(H)");
		mb = new JMenuBar();
		ta = new JTextArea();
		ta.setFont(new Font("华康少女文字W5(P)", Font.PLAIN, 12));
		label.setFont(new Font("楷体", Font.PLAIN, 12));
		JScrollPane sp = new JScrollPane(ta,
				JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
				JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		mFile.add(open);
		mFile.add(save);
		mFile.add(exit);
		mEdit.add(copy);
		mEdit.add(cut);
		mEdit.add(paste);
		mEdit.add(search);
		mCheck.add(state);
		mForm.add(lineWrap);
		mHelp.add(about);
		about.addActionListener(this);
		open.addActionListener(this);
		save.addActionListener(this);
		exit.addActionListener(this);
		copy.addActionListener(this);
		cut.addActionListener(this);
		paste.addActionListener(this);
		search.addActionListener(this);
		lineWrap.addItemListener(this);
		state.addItemListener(this);
		mb.add(mFile);
		mb.add(mEdit);
		mb.add(mForm);
		mb.add(mCheck);
		mb.add(mHelp);
		this.setJMenuBar(mb);
		this.add(sp);
		// int w = Toolkit.getDefaultToolkit().getScreenSize().width;
		// int h = Toolkit.getDefaultToolkit().getScreenSize().height;
		this.setTitle("记事本");
		this.setIconImage(Toolkit.getDefaultToolkit().getImage(
				NotePad.class.getClassLoader().getResource("images/Word.png")));
		this.setSize(700, 600);
		// this.setLocation((w - 600) / 2, (h - 400) / 2);
		dialog_load.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				dialog_load.setVisible(false);
			}

		});
		dialog_save.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				dialog_save.setVisible(false);
			}

		});
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// System.out.println(System.getProperty("line.separator"));
		new Thread(new Check()).start();
	}

	public void showState() {
		this.add(label, BorderLayout.SOUTH);
		this.setVisible(true);
		new Thread(new Show()).start();
	}

	public void checkEditable() {
		if (lineWrap.isSelected()) {
			state.setSelected(false);
			state.setEnabled(false);
		} else {
			state.setEnabled(true);
		}
	}

	// 用于检查状态栏是否可用的线程
	class Check implements Runnable {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				checkEditable();
			}
		}

	}

	// 用于显示状态栏的线程
	class Show implements Runnable {

		@Override
		public void run() {
			// TODO Auto-generated method stub
			while (true) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}

				int rowCount = 0;
				String str = ta.getText().substring(0, ta.getCaretPosition());
				for (int i = 0; i < str.length(); i++) {
					if (str.charAt(i) == '\n') {
						rowCount++;
					}
				}
				int columnCount = 0;
				int temp = 0;
				String strs[] = ta.getText()
						.substring(0, ta.getCaretPosition()).split("\n");
				if (strs.length > 1) {
					for (int i = 0; i < strs.length - 1; i++) {
						temp += strs[i].length();
					}
					if (ta.getCaretPosition() == temp + rowCount) {
						columnCount = 0;
					}
					columnCount = ta.getCaretPosition() - temp - rowCount;
				} else {
					columnCount = ta.getCaretPosition() + 1;
				}
				// label.setText(""+ta.getText().length());
				label.setText("字数:" + ta.getText().length() + "          "
						+ "第" + (rowCount + 1) + "行," + "第" + (columnCount)
						+ "列" + "      ");
				// System.out.println(ta.getCaretPosition());
			}
		}

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if (e.getSource() == open) {
			dialog_load.setVisible(true);
			String s;
			if (dialog_load.getFile() != null) {
				try {
					ta.setText(null);
					ta.setFont(new Font("宋体", Font.PLAIN, 16));
					File f = new File(dialog_load.getDirectory(),
							dialog_load.getFile());
					fr = new FileReader(f);
					br = new BufferedReader(fr);
					while ((s = br.readLine()) != null) {
						ta.append(s + '\n');
					}

					this.setTitle(dialog_load.getFile() + " - 记事本");
					// System.out.println(ta.getLineCount());
					fr.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
			}
		} else if (e.getActionCommand() == save.getText()) {
			dialog_save.setVisible(true);
			if (dialog_save.getFile() != null) {
				try {
					File f = new File(dialog_save.getDirectory(),
							dialog_save.getFile());
					fw = new FileWriter(f);
					bw = new BufferedWriter(fw);
					String str = ta.getText();
					String lines[] = str.split("\n");
					for (String line : lines) {
						bw.write(line + "\r\n");
					}

					bw.close();
					fw.close();
				} catch (IOException e2) {
					e2.printStackTrace();
				}
			}
		} else if (e.getActionCommand() == exit.getText()) {
			System.exit(0);
		}

		if (e.getSource() == copy) {
			copyString = ta.getSelectedText();
		}
		if (e.getSource() == cut) {
			copyString = ta.getSelectedText();
			ta.replaceRange("", ta.getSelectionStart(), ta.getSelectionEnd());
		}
		if (e.getSource() == paste) {
			ta.insert(copyString, ta.getCaretPosition());
		}

		if (e.getSource() == search) {
			new SearchFrame(this, "查找/替换", false).setVisible(true);
		}

		if (e.getSource() == about) {
			JOptionPane.showMessageDialog(
					this,
					"一个简单的记事本小程序,具有一些简单的编辑,查找功能",
					"^(oo)^",
					JOptionPane.INFORMATION_MESSAGE,
					new ImageIcon(Toolkit.getDefaultToolkit().getImage(
							NotePad.class.getClassLoader().getResource(
									"images/0.gif"))));
		}

	}

	@Override
	public void itemStateChanged(ItemEvent e) {
		// TODO Auto-generated method stub
		if (lineWrap.isSelected()) {
			ta.setLineWrap(true);
			ta.setWrapStyleWord(true);
		} else {
			ta.setLineWrap(false);
		}
		if (state.isSelected()) {
			showState();
		} else {
			this.remove(label);
			this.setVisible(true);
		}
	}

}


package com.hblg;
import java.awt.Dialog;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;



public class SearchFrame extends Dialog implements WindowListener,ActionListener {
	
	JPanel p1, p2, p3;
	JLabel lSearch, lReplace;
	JTextField tSearch, tReplace;
	JButton b;
	
	
	public SearchFrame(Frame arg0, String arg1, boolean arg2) {
		super(arg0, arg1, arg2);
		p1 = new JPanel();
		p2 = new JPanel();
		p3 = new JPanel();
		b = new JButton("确定");
		lSearch = new JLabel("查找");
		lReplace = new JLabel("替换");
		tSearch = new JTextField(12);
		tReplace = new JTextField(12);
		p1.add(lSearch);
		p1.add(tSearch);
		p2.add(lReplace);
		p2.add(tReplace);
		p3.setLayout(new FlowLayout(FlowLayout.CENTER));
		p3.add(b);
		this.add(p1);
		this.add(p2);
		this.add(p3);
		b.addActionListener(this);
		this.addWindowListener(this);
		this.setSize(300, 200);
		this.setModal(true);
		this.setLayout(new GridLayout(3, 1));
		this.setLocationRelativeTo(null);
	}

	@Override
	public void actionPerformed(ActionEvent arg0) {
		// TODO Auto-generated method stub
		String string = NotePad.ta.getText();
		String toFind = this.tSearch.getText();
		if(!toFind.equals("")) {
			int index = string.indexOf(toFind);
			int count = 0;
			while (index != -1) {
				//String str = string.substring(index, index+toFind.length());
				NotePad.ta.replaceRange(this.tReplace.getText(), index, index+toFind.length());
				index = string.indexOf(toFind, index+toFind.length());
				count ++;
			}
			System.out.println(count);
		} else {
			JOptionPane.showMessageDialog(this, "`(*∩_∩*)′,什么都没写啊!");
		}
	}
	
	@Override
	public void windowClosing(WindowEvent arg0) {
		// TODO Auto-generated method stub
		this.setVisible(false);
	}

	@Override
	public void windowActivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void windowClosed(WindowEvent arg0) {
		// TODO Auto-generated method stub
	}


	@Override
	public void windowDeactivated(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void windowDeiconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void windowIconified(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	@Override
	public void windowOpened(WindowEvent arg0) {
		// TODO Auto-generated method stub
		
	}


	
}

【J2SE】java仿windows记事本,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。