受疫情影响,本学期在家上网课学习专业课java。无疑是给本身基础不好的我雪上加霜。从今天起我将摸索的使用博客上传我的学习内容,希望和广大战友一起努力。

第一阶段:用java编写简单的记事本

  运用到主要的知识:简单的GUI,单例模式,IO流,线程

第一部分布局

java 一个记事本程序 java编写一个记事本_gui


拿我们电脑的记事本为例,主要分为两大部分:菜单栏和输入域。首先我们需要一个记事本这样的长方形的容器然后先给顶部加一个菜单栏,给下面加一个输入域。

public class NoteText extends JFrame {
	//属性
	JTextArea textArea;//文本域
	JMenuBar menuBar;//菜单条
	//构造器中获取容器
	public NoteText(String title) {
		super(title);
		Container container = getContentPane();
		container.setLayout(new BorderLayout());

		menuBar = new JMenuBar();
		container.add(menuBar, BorderLayout.NORTH);
		//BorderLayout是一种边界布局方式,我们把菜单条放在北部,也就是顶部。
	
		}
		
	}

其次我们可以发现菜单条上有若干个菜单比如:文件、编辑

java 一个记事本程序 java编写一个记事本_java 一个记事本程序_02


我们还可以发现每个菜单中又有很多菜单项,比如文件中有新建文件、保存等选项。

java 一个记事本程序 java编写一个记事本_java_03


  于是我们此时应该梳理一下三者的关系:菜单条

(JMenuBar),菜单(JMenu),菜单项(JmenuItem)。

菜单条放置菜单,菜单可以放置菜单项、也可以嵌套菜单形成子菜单。

于是我们在类中添加以上属性。

public class NoteText extends JFrame {
	//属性
	//对象实例
	public static NoteText instance;
	JTextArea textArea;//文本域
	//菜单条
	JMenuBar menuBar;
	//菜单
	JMenu menu_file, menu_edit, menu_font, menu_fontSize,menu_fontStyle;;
	//菜单项
	JMenuItem item_save, item_reset, item_open;
		

	public NoteText(String title) {
		super(title);
		Container container = getContentPane();
		container.setLayout(new BorderLayout());

		menuBar = new JMenuBar();
		container.add(menuBar, BorderLayout.NORTH);

		// 菜单条布局
		menu_file = new JMenu("file");
		menu_edit = new JMenu("edit");
		menuBar.add(menu_file);
		menuBar.add(menu_edit);

		// 菜单布局
		item_save = new JMenuItem("save");
		item_reset = new JMenuItem("reset");
		menu_file.add(item_save);
		menu_file.add(item_reset);

		menu_font = new JMenu("font");
		menu_edit.add(menu_font);
		menu_fontSize = new JMenu("fontSize");
		menu_fontStyle = new JMenu("fontStyle");
		menu_font.add(menu_fontSize);
		menu_font.add(menu_fontStyle);
		//文本框布局
		textArea = new JTextArea();
		textArea.setLineWrap(true);
		textArea.setFont(new Font(null, 0, 15));
		container.add(textArea, BorderLayout.CENTER);
		}
	}

  以上布局完成后一个简单的窗体就完成了,但是我们测试的时候不能简单的创建对象,因为我们知道我们记事本是用来存储文件的,会用到IO流,通常这时我们会用到单例模式来创建对象,保证IO流的安全性。

public static synchronized NoteText creatInstance() {
		if (instance == null) {
			instance = new NoteText("记事本");
		}
		return instance;
	}

以上代码就是一个简单的单例模式,用于每次只能创建一个实例。接下来我们就可以进行简单的测试。

public class NoteText extends JFrame {
	//属性
	//对象实例
	public static NoteText instance;
	JTextArea textArea;//文本域
	//菜单条
	JMenuBar menuBar;
	//菜单
	JMenu menu_file, menu_edit, menu_font, menu_fontSize,menu_fontStyle;;
	//菜单项
	JMenuItem item_save, item_reset, item_open;
		
	public static synchronized NoteText creatInstance() {
		if (instance == null) {
			instance = new NoteText("记事本");
		}
		return instance;
	}
	public NoteText(String title) {
		super(title);
		Container container = getContentPane();
		container.setLayout(new BorderLayout());

		menuBar = new JMenuBar();
		container.add(menuBar, BorderLayout.NORTH);

		// 菜单条布局
		menu_file = new JMenu("file");
		menu_edit = new JMenu("edit");
		menuBar.add(menu_file);
		menuBar.add(menu_edit);

		// 菜单布局
		item_save = new JMenuItem("save");
		item_reset = new JMenuItem("reset");
		menu_file.add(item_save);
		menu_file.add(item_reset);

		menu_font = new JMenu("font");
		menu_edit.add(menu_font);
		menu_fontSize = new JMenu("fontSize");
		menu_fontStyle = new JMenu("fontStyle");
		menu_font.add(menu_fontSize);
		menu_font.add(menu_fontStyle);
		//文本框布局
		textArea = new JTextArea();
		textArea.setLineWrap(true);
		textArea.setFont(new Font(null, 0, 15));
		container.add(textArea, BorderLayout.CENTER);
		}
	
		//主方法测试
		public static void main(String[] args) {
		try {
			NoteText.creatInstance();
		} catch (Exception e) {
			e.printStackTrace();
			}
		}
	}

完整代码如下:

package NoteText;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JTextArea;

public class NoteText extends JFrame {
	// 属性
	JTextArea textArea;
	JMenu menu_file, menu_edit, menu_font, menu_fontSize, menu_fontStyle;;
	JMenuBar menuBar;
	JMenuItem item_save, item_reset;
	int fontSize = 15;
	String fontStyle = "宋体";

	public NoteText(String title) {
		super(title);
		Container container = getContentPane();
		container.setLayout(new BorderLayout());

		menuBar = new JMenuBar();
		container.add(menuBar, BorderLayout.NORTH);

		// 菜单条布局
		menu_file = new JMenu("file");
		menu_edit = new JMenu("edit");
		menuBar.add(menu_file);
		menuBar.add(menu_edit);

		// 菜单布局
		item_save = new JMenuItem("save");
		item_reset = new JMenuItem("reset");
		menu_file.add(item_save);
		menu_file.add(item_reset);

		menu_font = new JMenu("font");
		menu_edit.add(menu_font);
		menu_fontSize = new JMenu("fontSize");
		menu_fontStyle = new JMenu("fontStyle");
		menu_font.add(menu_fontSize);
		menu_font.add(menu_fontStyle);

		String size[] = { "10", "12", "14", "16", "18", "20" };
		for (int i = 0; i < size.length; i++) {
			JMenuItem item = new JMenuItem(size[i]);
			menu_fontSize.add(item);
			// 正则表达式
			item.addActionListener(e -> {
				fontSize = Integer.parseInt(e.getActionCommand());
				textArea.setFont(new Font(null, 0, fontSize));
			});
		}

		String style[] = { "微软雅黑", "宋体", "楷体", "仿宋", "新宋体", "黑体" };
		for (int i = 0; i < style.length; i++) {
			JMenuItem item = new JMenuItem(style[i]);
			menu_fontStyle.add(item);
			// 正则表达式
			item.addActionListener(e -> {
				textArea.setFont(new Font(e.getActionCommand(), 0, fontSize));
			});
		}

		textArea = new JTextArea();
		textArea.setLineWrap(true);
		textArea.setFont(new Font(null, 0, 15));
		container.add(textArea, BorderLayout.CENTER);

		// 将已有的内容显示出来
		Path path = Paths.get("./DATA");
		FileReader fr = null;
		if (!Files.exists(path)) {
			try {
				Files.createDirectories(path);
			} catch (IOException e1) {
				e1.printStackTrace();
			}
		}
		try {
			fr = new FileReader("./DATA/Note.txt");
			char chs[] = new char[1024];
			int len;
			StringBuilder sb = new StringBuilder();
			while ((len = fr.read(chs)) != -1) {
				sb.append(new String(chs, 0, len));
			}
			textArea.setText(sb.toString());

		} catch (IOException e3) {
			e3.printStackTrace();
		} finally {
			try {
				fr.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

		// 为保存添加监听器
		item_save.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {

				FileWriter fw = null;

				try {
					fw = new FileWriter("./DATA/Note.txt");
					String txt = textArea.getText();
					fw.write(txt);

				} catch (IOException e2) {
					e2.printStackTrace();
				} finally {
					try {
						fw.close();
					} catch (IOException e1) {
						e1.printStackTrace();
					}
				}

			}
		});

		// 为清除添加功能
		item_reset.addActionListener(e -> textArea.setText("")); // 正则表达式

	}
	public void init() {
		
	}

	public static void main(String[] args) {
		NoteText noteText = new NoteText("记事本");
		noteText.setBounds(100, 100, 300, 350);
		noteText.setVisible(true);
		noteText.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

详细讲解未完待续~