Java实现记事本|IO流/GUI Java实现记事本

题目

利用GUI实现一个简单的记事本(notepad),即打开文件,文字内容显示在界面上;
允许对文字内容进行编辑,并可以保存到文件。

代码

package notePadExp;

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

class notPadcontainer{
	
	public Boolean visible = false;
	//组件定义成属性
	public JFrame notPadFrame;
	public JMenuBar notPadMenuBar;
	public JMenu firMenu;
	public JMenu secMenu;
	public JMenu thirMenu;
	public JMenu fourMenu;
	
	public JMenuItem buildItem;
	public JMenuItem openItem;
	public JMenuItem reserveItem;
	public JMenuItem paperSetItem;
	public JMenuItem clearItem;
	public JMenuItem aboutItem;
	public JMenuItem fontItem20;
	public JMenuItem fontItem40;
	public JTextArea textArea;
	public JScrollPane textScrollPane;
	
	 /*
	  * 无参构造函数 
	  * 创建组件 初始化组件
	 */
	notPadcontainer(){
		//窗体Frame
		this.notPadFrame = new JFrame("notePad by fishers"); //设置窗体 名字为notePad
		this.notPadFrame.setLayout(new BorderLayout()); //边界布局方式
		this.notPadFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置关闭框
		this.notPadFrame.setSize(500,500); //设置窗口大小

		//菜单组件
		this.notPadMenuBar = new JMenuBar();
		this.firMenu = new JMenu("文件");
		this.thirMenu = new JMenu("字体");
		this.secMenu = new JMenu("编辑");
		this.fourMenu = new JMenu("帮助");
		
		
		//create JMenuItem for the First menu
		this.buildItem = new JMenuItem("新建");
		this.openItem = new JMenuItem("打开");
		this.reserveItem = new JMenuItem("保存");
		this.paperSetItem = new JMenuItem("页面设置");
		
		//create JMenuItem for the sec thir four menu
		this.clearItem = new JMenuItem("清空");
		this.aboutItem = new JMenuItem("关于");
		this.fontItem20 = new JMenuItem("字体20号");
		this.fontItem40 = new JMenuItem("字体40号");
		//文本组件
		this.textArea = new JTextArea();
		this.textScrollPane = new JScrollPane(textArea);
		textArea.setFont(new Font("宋体",Font.PLAIN,20)); //默认20号字体
		ItemAdd();
		runListener();
	}
	
	//添加组件
	public void ItemAdd(){
		
		//添加JMenu到JMenuBar
		notPadMenuBar.add(firMenu);
		notPadMenuBar.add(secMenu);
		notPadMenuBar.add(thirMenu);
		notPadMenuBar.add(fourMenu);
		
		//添加JMenuItem到第一个菜单
		firMenu.add(buildItem);
		firMenu.add(openItem);
		firMenu.add(reserveItem);
		firMenu.add(paperSetItem);
		secMenu.add(clearItem);
		thirMenu.add(fontItem20);
		thirMenu.add(fontItem40);
		fourMenu.add(aboutItem);
		
		//notPadFrame中添加各个组件
		this.notPadFrame.setJMenuBar(notPadMenuBar);
		this.notPadFrame.add(textScrollPane,BorderLayout.CENTER);
	}

	
	
	/*
	 * 事件监听代码部分
	*/
	public void runListener() {
		//新建文件 = 清空。。
		buildItem.addActionListener( e -> {
			textArea.setText("");
		});		
		
		//打开文件
		openItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				//设置弹出框 FileDialog
				FileDialog saveFiledialog = new FileDialog(notPadFrame,"打开文件",FileDialog.LOAD);
				saveFiledialog.setVisible(true);
				String fileDir = saveFiledialog.getDirectory(); //拿到目录
				String fileName = saveFiledialog.getFile(); //拿到文件名
//				System.out.println(fileDir);
//				System.out.println(fileName);
				File openFile = new File(fileDir,fileName); //使用File类创建新文件对象
				try {
					FileReader freader = new FileReader(openFile); //字符流
					StringBuffer tempBuffer  = new StringBuffer();//StringBuffer可变
					int len = 0; //下面使用read方法读取
					while((len = freader.read()) != -1) {
						tempBuffer.append((char)len); //append方法加入StringBuffer
					}
					String openString = new String(tempBuffer.toString());
					textArea.setText(openString);
					freader.close();//关闭流
				} catch (FileNotFoundException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				} catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
		//保存文件
		reserveItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub 
				FileDialog saveFiledialog = new FileDialog(notPadFrame,"保存文件",FileDialog.SAVE);//父级frame 标题 mode
				saveFiledialog.setVisible(true);
				String fileDir = saveFiledialog.getDirectory();
				String fileName = saveFiledialog.getFile();
				System.out.println(fileDir);
				System.out.println(fileName);
				String ContentString = textArea.getText();
				File saveFile = new File(fileDir,fileName);
				try {
					FileWriter fWriter = new FileWriter(saveFile); //使用字符流写文件
					fWriter.write(ContentString); //写文件
					fWriter.close(); //关闭流
				}catch (IOException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		
		//清空文件
		clearItem.addActionListener( e -> {
			textArea.setText("");
		});

		//监听关于
		aboutItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				JFrame aboutFrame = new JFrame("关于"); //新建窗口
				aboutFrame.setLayout(new BorderLayout());
				aboutFrame.setSize(300,115);
				aboutFrame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);//设置隐藏窗口
				
				
				JPanel panel  = new JPanel();
				JLabel label = new JLabel("不会换行、中文乱码的记事本");
				JPanel panel2  = new JPanel();
				JLabel label2 = new JLabel("Copyright © 2019 fishers");
				panel.add(label);
				panel2.add(label2);
				aboutFrame.add(panel,BorderLayout.CENTER);
				aboutFrame.add(panel2,BorderLayout.PAGE_START);
				aboutFrame.setVisible(true);
			}
		});
		
		fontItem20.addActionListener(e->{
			textArea.setFont(new Font("宋体",Font.PLAIN,20));
		});
		
		fontItem40.addActionListener(e->{
			textArea.setFont(new Font("宋体",Font.PLAIN,40));
		});
	}
	
	
	
	//setVisible:设置窗口显示
	public void setVisible(Boolean visible) {
		this.visible = visible;
		this.notPadFrame.setVisible(this.visible);
	}
}

public class notePad {

	public static void main(String[] args) {
		notPadcontainer oneNote = new notPadcontainer();
		oneNote.setVisible(true);
	}

}