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事件处理及应用《菜单--书写记事本》

原文地址:https://www.cnblogs.com/shan333/p/14564797.html