`

我的第一个写字板程序 JNotePad

 
阅读更多
这个例子参考书《java 7 学习笔记》 作者 林信良

这本书挺不错的,台湾人写的书品质就是好。

只是宣传得有点夸张,比如他的另外一本书 《Servlet jsp 学习笔记》,

在 《java 7 学习笔记》中说书中有一个微博的例子,其实只是一个书签的例子。

好书是经得起考验的,不需要出版社过度的夸张宣传。

JNotePad.java

package com.xjh.swing;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Font;
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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

import javax.swing.BorderFactory;
import javax.swing.JFileChooser;
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.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.KeyStroke;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;

public class JNotePad extends JFrame {

	private JMenuBar menuBar;

	private JMenu fileMenu;
	private JMenuItem menuOpen;
	private JMenuItem menuSave;
	private JMenuItem menuSaveAs;
	private JMenuItem menuClose;

	private JMenu editMenu;
	private JMenuItem menuCut;
	private JMenuItem menuCopy;
	private JMenuItem menuPaste;

	private JMenu aboutMenu;
	private JMenuItem menuAbout;
	
	private JTextArea textArea;
	private JLabel stateBar;
	
	private JPopupMenu popUpMenu;
	
	private TextDAO textDAO;
	private JFileChooser fileChooser;

	public JNotePad(TextDAO textDAO) {
		this();
		this.textDAO = textDAO;
	}
	public JNotePad() {
		initCompanents();
		initEventListeners();
	}

	private void initCompanents() {
		setTitle("新增纯文本文件");
		setSize(400, 300);

		// 设置"文件"菜单
		fileMenu = new JMenu("文件");
		menuOpen = new JMenuItem("打开文件");
		menuSave = new JMenuItem("保存文件");
		menuSaveAs = new JMenuItem("另存新文件");
		menuClose = new JMenuItem("关闭");

		fileMenu.add(menuOpen);
		fileMenu.addSeparator(); // 分隔线
		fileMenu.add(menuSave);
		fileMenu.add(menuSaveAs);
		fileMenu.addSeparator(); // 分隔线
		fileMenu.add(menuClose);

		// 设置"编辑"菜单
		editMenu = new JMenu("编辑");
		menuCut = new JMenuItem("剪贴");
		menuCopy = new JMenuItem("拷贝");
		menuPaste = new JMenuItem("粘贴");

		editMenu.add(menuCut);
		editMenu.add(menuCopy);
		editMenu.add(menuPaste);

		// 设置"关于"菜单
		aboutMenu = new JMenu("关于");
		menuAbout = new JMenuItem("关于JNotePad");
		aboutMenu.add(menuAbout);

		// 菜单列
		menuBar = new JMenuBar();
		menuBar.add(fileMenu); // 文件
		menuBar.add(editMenu); // 编辑
		menuBar.add(aboutMenu); // 关于

		// 设置菜单列
		setJMenuBar(menuBar);
		
		// 文字编辑区
		textArea = new JTextArea();
		textArea.setFont(new Font("宋体", Font.PLAIN, 16));
		textArea.setLineWrap(true); // 设置自动换行
		// 水平滚动条(不显示)和垂直滚动条(当有需要的时候显示)
		JScrollPane pane = new JScrollPane(textArea, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		Container contentPane = this.getContentPane();
		contentPane.add(pane, BorderLayout.CENTER);
		// 状态栏
		stateBar = new JLabel("未修改");
		stateBar.setHorizontalAlignment(SwingConstants.LEFT); // 文字左对齐
		stateBar.setBorder(BorderFactory.createEtchedBorder());
		contentPane.add(stateBar, BorderLayout.SOUTH); // 布局管理器
		
		popUpMenu = editMenu.getPopupMenu();
		fileChooser = new JFileChooser();
	}

	private void initEventListeners() {
		// 点击窗口开关按钮事件处理
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				closeFile();
			}
		});
		
		// 菜单-打开文件
		menuOpen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				openFile();
			}
		});
		
		// 菜单-保存文件
		menuSave.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				saveFile();
			}
		});
		
		// 菜单-另存新文件
		menuSaveAs.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				saveFileAs();
			}
		});
		
		// 菜单-关闭文件
		menuClose.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				closeFile();
			}
		});
		
		// 菜单-剪切
		menuCut.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				cut();
			}
		});
		
		// 菜单-复制
		menuCopy.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				copy();
			}
		});
		
		// 菜单-粘贴
		menuPaste.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				paste();
			}
		});
		
		// 菜单-关于
		menuAbout.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				// 显示对话框
				JOptionPane.showOptionDialog(null, 
						"JNotePad 0.1", 
						"关于JNotePad", 
						JOptionPane.DEFAULT_OPTION, 
						JOptionPane.INFORMATION_MESSAGE, 
						null, 
						null, 
						null);
			}
		});
		
		// 编辑区键盘事件
		textArea.addKeyListener(new KeyAdapter() {
			public void keyTyped(KeyEvent e) {
				jtextAreaActionPerformed();
			}
		});
		
		// 编辑区鼠标事件
		textArea.addMouseListener(new MouseAdapter() {
			public void mouseReleased(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON3) {
					popUpMenu.show(editMenu, e.getX(), e.getY());
				}
			}
			
			public void mouseClicked(MouseEvent e) {
				if (e.getButton() == MouseEvent.BUTTON1) {
					popUpMenu.setVisible(false);
				}
			}
		});
		
//		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		// 快捷键设置
		menuOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O,
				InputEvent.CTRL_MASK));
		menuSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S,
				InputEvent.CTRL_MASK));
		menuClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q,
				InputEvent.CTRL_MASK));
		menuCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X,
				InputEvent.CTRL_MASK));
		menuCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,
				InputEvent.CTRL_MASK));
		menuPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
				InputEvent.CTRL_MASK));

	}
	
	private void openFile() {
		if (stateBar.getText().equals("未修改")) { // 文件是否为存储状态
			showFileDialog(); // 打开文件
		} else {
			int option = JOptionPane.showConfirmDialog(null, 
					"文件已修改,是否保存?",
					"保存文件?",
					JOptionPane.YES_NO_OPTION,
					JOptionPane.WARNING_MESSAGE,
					null);
			switch (option) {
				case JOptionPane.YES_OPTION: // 确认文件保存
					saveFile(); // 保存文件
					break;
				case JOptionPane.NO_OPTION: // 放弃文件保存
					showFileDialog();
					break;
			}
					
		}
	}
	
	private void showFileDialog() {
		int option = fileChooser.showDialog(null, null); // 文件选取对话框
		// 使用者单击确认键
		if (option == JFileChooser.APPROVE_OPTION) {
			try {
				setTitle(fileChooser.getSelectedFile().toString());
				textArea.setText("");
				stateBar.setText("未修改");
				
				String text = textDAO.read(fileChooser.getSelectedFile().toString());
				textArea.setText(text);
			} catch (Throwable e) {
				JOptionPane.showMessageDialog(null, e.toString(),
						"打开文件失败", JOptionPane.ERROR_MESSAGE);
						
			}
		}
	}
	private void saveFile() {
		// 从标题栏获取文件名
		Path path = Paths.get(getTitle());
		if (Files.notExists(path)) {
			saveFileAs();
		} else {
			try {
				textDAO.save(path.toString(), textArea.getText());
				stateBar.setText("未修改");
			} catch (Throwable e) {
				JOptionPane.showMessageDialog(null, e.toString(),
						"写入文件失败", JOptionPane.ERROR_MESSAGE);
			}
		}
		
	}
	private void saveFileAs() {
		int option = fileChooser.showDialog(null, null);
		if (option == JFileChooser.APPROVE_OPTION) {
			setTitle(fileChooser.getSelectedFile().toString());
			textDAO.create(fileChooser.getSelectedFile().toString());
			saveFile();
		}
		
	}
	private void closeFile() {
		if (stateBar.getText().equals("未修改")) {
			dispose();
		} else {
			int option = JOptionPane.showConfirmDialog(null, "文件已经修改, 是否保存?",
					"保存文件?", 
					JOptionPane.YES_NO_OPTION,
					JOptionPane.WARNING_MESSAGE, 
					null);
			switch (option) {
			case JOptionPane.YES_OPTION:
				saveFile();
				break;
			case JOptionPane.NO_OPTION:
				dispose();
			}
					
		}
		
	}
	private void cut() {
		textArea.cut();
		stateBar.setText("已修改");
		popUpMenu.setVisible(false);
	}
	
	private void copy() {
		textArea.copy();
		popUpMenu.setVisible(false);
	}
	
	private void paste() {
		textArea.paste();
		stateBar.setText("已修改");
		popUpMenu.setVisible(false);
	}
	
	private void jtextAreaActionPerformed() {}

	public static void main(String[] args) throws InvocationTargetException,
			InterruptedException {
		javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
			@Override
			public void run() {
				new JNotePad().setVisible(true);
			}
		});
	}

}



TextDAO.java

package com.xjh.swing;

public interface TextDAO {
	
	void create(String file);

	String read(String toString);

	void save(String file, String text);
}



FileTextDAO.java

package com.xjh.swing;

import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;

public class FileTextDAO implements TextDAO {
	
	@Override
	public String read(String file) {
		byte[] datas = null;
		try {
			datas = Files.readAllBytes(Paths.get(file));
		} catch (IOException ex) {
			Logger.getLogger(FileTextDAO.class.getName()).log(Level.SEVERE, null, ex);
		}
		return new String(datas);
	}
	
	@Override
	public void save(String file, String text) {
		try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(file), 
				Charset.forName(System.getProperty("file.endoding")))) {
					writer.write(text);
		} catch (IOException ex) {
			Logger.getLogger(FileTextDAO.class.getName()).log(Level.SEVERE, null, ex);
		}
	}

	@Override
	public void create(String file) {
		try {
			Files.createFile(Paths.get(file));
		} catch (IOException ex) {
			Logger.getLogger(FileTextDAO.class.getName()).log(Level.SEVERE, null, ex);
		}
	}
		
}

分享到:
评论

相关推荐

    JNotePad

    JNotePad 是一个基于 Java 编程语言,利用 Swing 工具包开发的记事本程序。它以其简洁的用户界面和实用的功能,为用户提供了一个轻量级的文本编辑环境。作为一个多标签的记事本应用,JNotePad 允许用户同时处理多个...

    JNotePad.jar

    JNote可能是一个更成熟或功能更全面的文本编辑器,而JNotePad.jar作为个人练习项目,是对JNote的一种简化或定制版本。 总结而言,JNotePad.jar是一款注重实用性的文本编辑工具,通过快捷键的自定义和撤销/恢复功能...

    Java写的记事本JNotePad

    【Java写的记事本JNotePad】是一款由个人开发者用Java编程语言编写的简单文本编辑器,类似于我们常见的Windows系统自带的记事本程序。它为初学者提供了一个学习Java GUI(图形用户界面)编程和事件处理的实例,同时...

    JNotePad java 记事本

    "JNotePad" 是一个基于Java实现的简单记事本程序,它为初学者提供了理解Java GUI(图形用户界面)编程的基础。通过这个项目,我们可以学习到如何构建一个具有基本文本编辑功能的应用,如打开、保存、复制、粘贴等。 ...

    基于JavaFX的JNotepad跨平台文本编辑器设计源码

    JNotepad是一款采用Java和JavaFX技术构建的跨平台文本编辑器源码,集成了162个文件,其中包含115个Java源文件、13个PNG图片资源、5个Markdown文档、4个YAML配置文件、4个XML配置文件、3个JAR包、3个属性文件以及2个...

    JNotepad(Java Notepad) 是一款简约而强大的跨平台文本编辑器

    JNotepad(Java Notepad) 是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能以及插件化使用。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。 ...

    JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能

    JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。 JNotepad使用Java...

    JNotepad-开源

    JNotePad 是一种 Java 编辑工具,专门设计用于处理多个 Java 文件(源文件)以及一些有用的工具,如构建小程序、编译文件夹等。它还包含适用于新手用户的 SET PATH 实用程序。 操作系统:Windows 代码:Visual Basic

    Netbeans jdk6 Jnotepade

    【标题】"Netbeans jdk6 Jnotepade"指的是使用NetBeans集成开发环境(IDE)基于Java JDK 6版本创建的一个项目,该项目可能是一个简单的文本编辑器或类似JNotepad的应用程序。JNotepad是Java中常见的一个基础文本编辑...

    JNotePad-开源

    JNotePad是一个非常灵活的文本编辑器。 有了很多模块,cou可以创建您自己的用户友好的编辑器。 通过仅选择所需的模块,您将获得非常高效的编辑器。

    GraalVM编译的Swing原生应用示例和源码-记事本文本编辑器

    在这个示例中,我们关注的是如何使用GraalVM编译一个基于**Swing**的原生应用程序——一个简单的记事本文本编辑器。Swing是Java提供的一种用于构建桌面应用程序的GUI工具包,它在AWT的基础上提供了更丰富的组件和...

    JAVA + NetBeans 开发的仿 Windows记事本

    在本文中,我们将深入探讨如何使用Java编程语言和NetBeans集成开发环境(IDE)来创建一个仿Windows记事本的应用程序——JNotepad。这个项目不仅对于初学者来说是一个很好的实践,而且对于有一定经验的开发者来说,也...

    JNotepad:一个用 Java 编写的非常基本的记事本-开源

    一个用 Java 编写的非常基本的记事本。 它是为教育目的而开发的,但我希望与社区分享我的工作。

    JAVA -笔记本系统

    在这个“JAVA - 笔记本系统”项目中,我们可以推测这是一个使用Java SE实现的简单文本编辑器,类似于Windows中的记事本程序。JNotePad可能是这个项目的源代码文件或执行文件。在Java中创建这样的文本编辑器,开发者...

    JNotepad:使用 Swing 在 Java 中完全重制 Windows Notepad

    记事本 使用 Swing 在 Java 中完全重制 Windows 记事本。... 唯一没有实现的菜单项是页面设置,这是不必要的,因为 textArea.print() 对话框有一个用于页面设置的选项卡。 用 Java 完整复制 Windows 记事本。

    java记事本java记事本java记事本

    根据提供的文件信息,我们可以分析出这是一个使用Java语言编写的简易记事本程序(JNotePadUI)。该程序利用了Swing库来构建图形用户界面,实现了基本的文件操作功能,如打开、保存、另存为以及关闭等。下面将详细...

    记事本源代码

    标题中的“记事本源代码”指的是一个使用Java编程语言实现的文本编辑器,类似于Windows操作系统中的记事本程序。这种程序通常具有基本的文本编辑功能,如打开、保存、新建、复制、粘贴、查找、替换等。描述中提到这...

    Java实现的 类似于记事本的 文本编辑器

    Java实现的文本编辑器,如"JNotePad",是一个基于Java Swing库构建的应用程序,旨在提供类似Windows记事本的功能。这样的项目是学习和掌握Java输入/输出(IO)和图形用户界面(GUI)设计的绝佳实践。下面将详细讨论...

    Java仿Windows记事本源代码分享

    在Java编程领域,开发一个仿Windows记事本的程序是一个常见的练习项目,它可以帮助开发者熟悉图形用户界面(GUI)的设计和事件处理。本篇将详细讲解如何使用Java Swing库来实现这一功能。 首先,我们需要引入必要的...

Global site tag (gtag.js) - Google Analytics