这个例子参考书《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 是一个基于 Java 编程语言,利用 Swing 工具包开发的记事本程序。它以其简洁的用户界面和实用的功能,为用户提供了一个轻量级的文本编辑环境。作为一个多标签的记事本应用,JNotePad 允许用户同时处理多个...
JNote可能是一个更成熟或功能更全面的文本编辑器,而JNotePad.jar作为个人练习项目,是对JNote的一种简化或定制版本。 总结而言,JNotePad.jar是一款注重实用性的文本编辑工具,通过快捷键的自定义和撤销/恢复功能...
【Java写的记事本JNotePad】是一款由个人开发者用Java编程语言编写的简单文本编辑器,类似于我们常见的Windows系统自带的记事本程序。它为初学者提供了一个学习Java GUI(图形用户界面)编程和事件处理的实例,同时...
"JNotePad" 是一个基于Java实现的简单记事本程序,它为初学者提供了理解Java GUI(图形用户界面)编程的基础。通过这个项目,我们可以学习到如何构建一个具有基本文本编辑功能的应用,如打开、保存、复制、粘贴等。 ...
JNotepad是一款采用Java和JavaFX技术构建的跨平台文本编辑器源码,集成了162个文件,其中包含115个Java源文件、13个PNG图片资源、5个Markdown文档、4个YAML配置文件、4个XML配置文件、3个JAR包、3个属性文件以及2个...
JNotepad(Java Notepad) 是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能以及插件化使用。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。 ...
JNotepad(Java Notepad)是一款简约而强大的跨平台文本编辑器,旨在提供用户友好的界面和丰富的功能。无论你是在Linux、Windows还是macOS系统上使用,JNotepad都能满足你对文本编辑和查看的需求。 JNotepad使用Java...
JNotePad 是一种 Java 编辑工具,专门设计用于处理多个 Java 文件(源文件)以及一些有用的工具,如构建小程序、编译文件夹等。它还包含适用于新手用户的 SET PATH 实用程序。 操作系统:Windows 代码:Visual Basic
【标题】"Netbeans jdk6 Jnotepade"指的是使用NetBeans集成开发环境(IDE)基于Java JDK 6版本创建的一个项目,该项目可能是一个简单的文本编辑器或类似JNotepad的应用程序。JNotepad是Java中常见的一个基础文本编辑...
JNotePad是一个非常灵活的文本编辑器。 有了很多模块,cou可以创建您自己的用户友好的编辑器。 通过仅选择所需的模块,您将获得非常高效的编辑器。
在这个示例中,我们关注的是如何使用GraalVM编译一个基于**Swing**的原生应用程序——一个简单的记事本文本编辑器。Swing是Java提供的一种用于构建桌面应用程序的GUI工具包,它在AWT的基础上提供了更丰富的组件和...
在本文中,我们将深入探讨如何使用Java编程语言和NetBeans集成开发环境(IDE)来创建一个仿Windows记事本的应用程序——JNotepad。这个项目不仅对于初学者来说是一个很好的实践,而且对于有一定经验的开发者来说,也...
一个用 Java 编写的非常基本的记事本。 它是为教育目的而开发的,但我希望与社区分享我的工作。
在这个“JAVA - 笔记本系统”项目中,我们可以推测这是一个使用Java SE实现的简单文本编辑器,类似于Windows中的记事本程序。JNotePad可能是这个项目的源代码文件或执行文件。在Java中创建这样的文本编辑器,开发者...
记事本 使用 Swing 在 Java 中完全重制 Windows 记事本。... 唯一没有实现的菜单项是页面设置,这是不必要的,因为 textArea.print() 对话框有一个用于页面设置的选项卡。 用 Java 完整复制 Windows 记事本。
根据提供的文件信息,我们可以分析出这是一个使用Java语言编写的简易记事本程序(JNotePadUI)。该程序利用了Swing库来构建图形用户界面,实现了基本的文件操作功能,如打开、保存、另存为以及关闭等。下面将详细...
标题中的“记事本源代码”指的是一个使用Java编程语言实现的文本编辑器,类似于Windows操作系统中的记事本程序。这种程序通常具有基本的文本编辑功能,如打开、保存、新建、复制、粘贴、查找、替换等。描述中提到这...
Java实现的文本编辑器,如"JNotePad",是一个基于Java Swing库构建的应用程序,旨在提供类似Windows记事本的功能。这样的项目是学习和掌握Java输入/输出(IO)和图形用户界面(GUI)设计的绝佳实践。下面将详细讨论...
在Java编程领域,开发一个仿Windows记事本的程序是一个常见的练习项目,它可以帮助开发者熟悉图形用户界面(GUI)的设计和事件处理。本篇将详细讲解如何使用Java Swing库来实现这一功能。 首先,我们需要引入必要的...