swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)
1.本次记事本项目的知识总结:
①记事本的样式是:菜单栏JMenuBar里装菜单JMenu,菜单里装菜单项JMenuItem。
②使用java内置的一些选择对话框:例如,文件选择对话框JFileChooser、颜色选择对话框JColorChooser。
③菜单样式已经完成,需要实现添加事件(实现功能,例如鼠标点击“新建”、“打开”等有不同的功能展示)。
④(由于事件越来越复杂,我们选择封装事件到一个外部类里,需要用的时候再实例外部类。为了在外部类里实现操作当前的窗体(控件)类,我们定义了一个窗体对象属性,并且通过构造方法,以参数的形式,把窗体传到外部类里来操作。
而在窗体类里实例化外部类时把自身当作参数,就可以使用外部类的操作啦,即把两个类紧密结合起来啦):
⑤设置带滚动条的文本域:
first、实例化文本域对象,设置实现文本能够换行,需要设置一下文本域:通过调用文本域的.setLineWrap(true);方法。
second、再实例化滚动面板的同时把文本域控件作为参数传入,
third、 然后设置滚动面板的垂直滚动条。
⑥外部类添加事件处理方法:这里我们根据按钮的文本,做出不同处理。通过事件对象的.getActionCommand()获取按钮的文本:
⑦实现右键弹出菜单:
first: 实例化右键弹出菜单:JpopupMenu.
second: 右键菜单添加菜单项:JMenuItem.
third:添加右键鼠标触发菜单事件:addMouseListener(鼠标适配器对象MouseAdapter)---实现mouseClicked()方法
2.全部代码:
❀记事本窗体类:
package com.xuetang9.kenny.notePaneDemo; import java.awt.BorderLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JSeparator; import javax.swing.JTextArea; import javax.swing.ScrollPaneConstants; /** * 记事本类 * * @author * */ public class NotePane extends JFrame { private static final String[] strMenu = { "文件(F)", "编辑(E)", "格式(O)", "查看(V)", "帮助(H)" }; // 菜单栏的菜单文本 private static final String[][] strMenuItem = { { "新建", "新窗口", "打开", "保存", "另存为", "-", "页面设置", "打印", "-", "退出" }, { "撤销", "-", "复制", "剪切", "粘贴", "删除", "-", "使用bing搜索", "查找", "查找下一个" }, { "自动换行", "字体", null, null, null, null, null, null, null }, { "查看", "状态栏", null, null, null, null, null, null, null, null }, { "查看帮助", "发送反馈", "关于记事本", null, null, null, null, null, null, null } }; private static final String[] strPopMenu = {"撤销", "复制", "剪切", "粘贴", "删除", "全选", "显示Unicode的控制字符"}; protected JTextArea txtContent = new JTextArea(); //文本域控件 //实例化外部事件类,并且把本类对象作为参数传入 NotePaneActionListener notePaneActionListener = new NotePaneActionListener(this); //右键弹出菜单对象 JPopupMenu popMenu = new JPopupMenu(); public NotePane() { // 构造方法实现记事本窗体的基本设置 // 设置标题 setTitle("记事本"); // 设置退出模式 setDefaultCloseOperation(EXIT_ON_CLOSE); // 设置窗体大小 setSize(800, 600); // 居中 setLocationRelativeTo(null); // 其余初始化工作封装到initComponnets方法 initComponnets(); // 事件方法 initEvent(); //为了酷一点再添加右键弹出菜单,右键弹出菜单的初始化工作 initPopMenu(); } /** * 为了酷一点再添加右键弹出菜单 */ private void initPopMenu() { //右键弹出菜单里添加菜单项目 for(String strPopMenu : strPopMenu) { //创建菜单项 JMenuItem menuItem = new JMenuItem(strPopMenu); //添加菜单项到弹出菜单 this.popMenu.add(menuItem); } //文本域添加右键鼠标触发菜单事件 txtContent.addMouseListener(new MouseAdapter() { //实现点击事件 public void mouseClicked(MouseEvent e) { //判断事件是鼠标右键事件 if(e.getButton() == MouseEvent.BUTTON3) //弹出菜单 popMenu.show(txtContent, e.getX(), e.getY()); } }); } /** * 封装了窗体的其余初始化工作initComponnets方法 */ private void initComponnets() { // 1.创建菜单栏,菜单栏里添加菜单,菜单里添加菜单项(做出菜单的样式) JMenuBar menuBar = new JMenuBar(); // 外层循环菜单栏添加菜单,内层循环菜单添加菜单项 for (int i = 0; i < strMenu.length; i++) { // 创建菜单 JMenu menu = new JMenu(strMenu[i]); for (int j = 0; j < strMenuItem[i].length; j++) { if (null == strMenuItem[i][j]) // 如果是null continue; if ("-".equals(strMenuItem[i][j])) { // 如果是"-",设置为分割符 menu.add(new JSeparator()); } else if ("状态栏".equals(strMenuItem[i][j])) {// 如果是"状态栏" // 添加菜单复选框项 JCheckBoxMenuItem checkBoxMenuItem = new JCheckBoxMenuItem(strMenuItem[i][j]); menu.add(checkBoxMenuItem); //添加事件 checkBoxMenuItem.addActionListener(notePaneActionListener); } else { // 创建菜单项 JMenuItem menuItem = new JMenuItem(strMenuItem[i][j]); // 菜单添加菜单项 menu.add(menuItem); //添加事件 menuItem.addActionListener(notePaneActionListener); } } // 菜单栏添加菜单 menuBar.add(menu); } // 窗体的菜单栏设置添加定义的菜单栏 this.setJMenuBar(menuBar); //2.内容面板添加带滚动条的文本域 //设置文本域,实现换行 txtContent.setLineWrap(true); //创建滚动面板 JScrollPane scrollPane = new JScrollPane(txtContent); //设置滚动面板带有垂直滚动条 scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); //内容面板添加滚动面板 getContentPane().add(scrollPane, BorderLayout.CENTER); } private void initEvent() { //2.菜单样式做完,添加事件,由于事件复杂,选择把事件封装到一个外部类里 } public static void main(String[] args) { new NotePane().setVisible(true); } }
❀事件外部类
package com.xuetang9.kenny.notePaneDemo; import java.awt.Color; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.IOException; import javax.swing.JColorChooser; import javax.swing.JFileChooser; /** * 封装了NotePane类的事件 * @author * */ public class NotePaneActionListener implements ActionListener{ //窗体对象属性,为了在本类中操作它,同时为了与窗体类联系起来,我们通过构造方法把窗体类对象作为参数传入 private NotePane notePane; public NotePaneActionListener(NotePane notePane) { this.notePane = notePane; } //书写事件方法,ActionEvent 事件源 @Override public void actionPerformed(ActionEvent e) { //获取点击事件源的文本 String strContent = e.getActionCommand(); //也可以通过“工厂模式实现”,但是这里我们写的比较简单,就直接switch结构写啦 switch(strContent) { case "新建": //新建,就是把文本域清空 notePane.txtContent.setText(" "); break; case "打开": //打开显示文件选择对话框,读取用户选择的文件内容到文本域,其中打开显示文件选择对话框封装成一个方法,而读取用户选择的文件内容封装成一个工具类 openFileChoice(); break; case "字体": //打开显示字体颜色选择对话框,读取用户选择的颜色,修改文本域中的字体颜色 fontColor(); break; } } /** * 打开显示字体颜色选择对话框,读取用户选择的颜色,修改文本域中的字体颜色 */ private void fontColor() { //使用java内置的颜色选择对话框 //创建一个颜色选择对话框对象 JColorChooser colorChooser = new JColorChooser(Color.ORANGE); //显示颜色对话框,并且获取用户选择的颜色 Color color = colorChooser.showDialog(notePane, "请选择颜色", Color.ORANGE); //修改文本域中的字体颜色 notePane.txtContent.setForeground(color); } /** * 封装打开显示文件选择对话框 * @throws IOException */ private void openFileChoice() { // 使用Java内置的文件选择对话框 //创建一个文件选择对话框对象 JFileChooser fileChooser = new JFileChooser(); //显示文件选择对话框 fileChooser.showOpenDialog(notePane); //获取用户选择的文件 File file = fileChooser.getSelectedFile(); //读取用户选择文件的内容 String content = null; try { content = ReadFileUtil.readContent(file.getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } //把读取的内容设置到文本域 notePane.txtContent.setText(content); } }
❀读取文件的工具类:
package com.xuetang9.kenny.notePaneDemo; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.Reader; /** * 读取文件的工具类 * * @author Huangyujun * */ public class ReadFileUtil { /** * 读取文件内容并且返回读取的内容的静态方法 * * @param path 文件路径 * @return * @throws IOException */ public static String readContent(String path) throws IOException { // 创建一个文件对象 File file = new File(path); // 判断文件是否存在 if (!file.exists()) { return null; } // 定义读取文件内容并且返回内容的数组 StringBuilder content = new StringBuilder(); // 通过字符串读取缓存流读取 Reader reader = null; BufferedReader bufferReader = null; reader = new FileReader(file); bufferReader = new BufferedReader(reader); // 一行一行读取 String line = null; while ((line = bufferReader.readLine()) != null) { content.append(line).append(System.getProperty("line.separator")); } //关闭流 bufferReader.close(); reader.close(); return content.toString(); } }
3.整个项目的每部分实现:https://www.cnblogs.com/shan333/p/14564855.html swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)每部分的实现