zoukankan      html  css  js  c++  java
  • swing做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)

    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做一个简单的记事本(有菜单的样式、右键弹出菜单、以及实现“新建”和“打开”功能)每部分的实现

    参考自:老九学堂java线上课程第十六章swing事件处理及应用《菜单--书写记事本》

  • 相关阅读:
    线性代数复习向量空间线性相关向量组的秩
    证明:将n(n为2的幂)个点的位反转环划分为长为j(2的幂)的连续片段,这些片段都是次序等价的(分布式算法)
    vim命令小合集
    poj2240floyd算法
    visual studio打开文件所在目录
    5个0,4个1组成的字符串中,出现01或10的次数为4的不同字符串个数
    max spacing kclustering(类似kruskal最小生成树)并查集Debuging
    算法导论16.35huffman树的表示
    最优二叉查找树optimalBSTC++实现2
    算法导论16.37
  • 原文地址:https://www.cnblogs.com/shan333/p/14564797.html
Copyright © 2011-2022 走看看