Java讲课笔记30:事件处理机制

零、本讲学习目标

1、熟悉事件处理机制

2、掌握Swing常用事件的使用

一、事件处理机制

(一)事件处理机制概述

Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的单击鼠标、按下键盘等操作。

(二)Swing事件处理涉及三类对象

1、事件源(Event Source)

事件发生的场所,通常就是产生事件的组件,例如窗口、按钮、菜单等。

2、事件对象(Event)

封装了GUI组件上发生的特定事件(通常就是用户的一次操作)。

3、监听器(Listener)

负责监听事件源上发生的事件,并对各种事件做出相应处理的对象(对象中包含事件处理器)。

(三)事件处理流程

在这里插入图片描述
事件源是一个组件,当用户进行一些操作时,如按下鼠标或者释放键盘等,都会触发相应的事件,如果事件源注册了监听器,则触发的相应事件将会被处理。

(四)事件处理步骤

1、创建事件源

除了一些常见的按钮、键盘等组件可以作为事件源外,包括JFrame窗口在内的顶级容器也可以作为事件源。

2、自定义监听器

根据要监听的事件源创建指定类型的监听器进行事件处理,该监听器是一个特殊的Java类,必须实现XxxListener接口(根据组件触发的动作进行区分,如WindowListener用于监听窗口事件,ActionListener用于监听动作事件)。然后重写接口的事件处理方法,实现相应的具体功能。

3、为事件源注册监听器

使用addXxxListener()方法为指定事件源添加特定类型的监听器。当事件源上发生监听的事件后,就会触发绑定的事件监听器,然后由监听器中的方法进行相应处理。

(五)案例:给登录窗口程序添加事件处理

1、将第29讲的LoginFrame拷贝到当前包

在这里插入图片描述

2、给【取消】按钮注册动作监听器

  • 注册动作监听器,调用按钮对象的addActionListener()方法
  • 创建动作监听器接口的匿名对象作为addActionListener()方法的参数
  • 编写事件处理方法actionPerformed(ActionEvent e)

在这里插入图片描述
在这里插入图片描述

// 给【取消】按钮注册动作监听器                                    
btnCancel.addActionListener(new ActionListener() {   
    @Override                                        
    public void actionPerformed(ActionEvent e) {     
        // 退出应用程序                                    
        System.exit(0);                              
    }                                                
});                                                  

3、给【登录】按钮注册动作监听器

  • 注册动作监听器,调用按钮对象的addActionListener()方法
  • 创建动作监听器接口的匿名对象作为addActionListener()方法的参数
  • 编写事件处理方法actionPerformed(ActionEvent e)

在这里插入图片描述

// 给【登录】按钮注册动作监听器                                                                  
btnLogin.addActionListener(new ActionListener() {                                  
    @Override                                                                      
    public void actionPerformed(ActionEvent e) {                                   
        // 获取用户输入的用户名与密码                                                           
        String username = txtUsername.getText().toString();                        
        String password = new String(txtPassword.getPassword());                   
        // 判断用户输入的用户名与密码是否正确(假定用户名和密码都是admin)                                      
        if (username.equals("admin")) {                                            
            if (password.equals("admin")) {                                        
                JOptionPane.showMessageDialog(LoginFrame.this,                     
                        "欢迎登录系统!", "提示信息", JOptionPane.INFORMATION_MESSAGE);       
                LoginFrame.this.dispose(); // 关闭登录窗口                               
            } else {                                                               
                JOptionPane.showMessageDialog(LoginFrame.this,                     
                        "密码有错误!", "提示信息", JOptionPane.ERROR_MESSAGE);              
                txtPassword.requestFocus(); // 让密码文本框获取焦点                          
                txtPassword.selectAll(); // 选中密码全部文本                               
            }                                                                      
        } else {                                                                   
            JOptionPane.showMessageDialog(LoginFrame.this,                         
                    "用户名有错误!", "提示信息", JOptionPane.ERROR_MESSAGE);                 
            txtUsername.requestFocus(); // 让用户名文本框获取焦点                             
            txtUsername.selectAll(); // 选中用户名全部文本                                  
        }                                                                          
    }                                                                              
});                                                                                

4、运行程序,查看结果

在这里插入图片描述

二、Swing常用事件处理

(一)Swing常用事件

在这里插入图片描述

(二)窗体事件

1、窗体事件概述

对窗体进行操作时,例如窗体的打开、关闭、激活、停用等,这些动作都属于窗体事件。Java中提供了一个WindowEvent类用于表示窗体事件。

2、窗体事件使用方法

首先需要定义一个实现了WindowListener接口的类作为窗体监听器,然后通过addWindowListener()方法将窗体对象与窗体监听器进行绑定。

3、案例演示:演示窗体事件

  • 继承JFrame,创建WindowEventDemo
    在这里插入图片描述
    在这里插入图片描述
package net.hw.lesson30;

import javax.swing.*;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

/**
 * 功能:演示窗体事件
 * 作者:华卫
 * 日期:2020年05月30日
 */
public class WindowEventDemo extends JFrame {
    public static void main(String[] args) {
        // 创建窗口对象
        JFrame frame = new JFrame("演示窗体事件");

        // 设置窗口属性
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 给窗口注册监听器
        frame.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("windowOpened--窗体打开事件");
            }

            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("windowClosing--窗体正在关闭事件");
            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("windowClosed--窗体已关闭事件");
            }

            @Override
            public void windowIconified(WindowEvent e) {
                System.out.println("windowIconified--窗体图标化事件");
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                System.out.println("windowDeiconified--窗体取消图标化事件");
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("windowActivated--窗体激活事件");
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("windowDeactivated--窗体停用事件");
            }
        });
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述

(三)鼠标事件

1、鼠标事件概述

用户会经常使用鼠标来进行选择、切换界面等操作,这些操作被定义为鼠标事件,其中包括鼠标按下、鼠标松开、鼠标单击等。Java中提供了一个MouseEvent类用于表示鼠标事件。几乎所有的组件都可以产生鼠标事件。

2、鼠标事件使用方法

首先需要通过实现MouseListener接口定义监听器(也可以通过继承适配器MouseAdapter类来实现),然后调用addMouseListener()方法将监听器绑定到事件源对象。

3、案例演示:演示鼠标事件

  • 创建MouseEventDemo
    在这里插入图片描述
package net.hw.lesson30;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

/**
 * 功能:演示鼠标事件
 * 作者:华卫
 * 日期:2020年05月30日
 */
public class MouseEventDemo {
    public static void main(String[] args) {
        // 创建窗口对象
        JFrame frame = new JFrame("演示鼠标事件");
        // 设置窗口边界
        frame.setBounds(200, 200, 300, 200);
        // 设置屏幕居中(采用相对定位方式)
        frame.setLocationRelativeTo(null);
        // 设置窗口布局
        frame.setLayout(new FlowLayout());

        // 创建按钮对象
        JButton btnTest = new JButton("测试按钮");
        // 将按钮添加到窗口
        frame.add(btnTest);

        // 设置窗口可见
        frame.setVisible(true);
        // 设置默认关闭方式(关闭窗口就退出应用程序)
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 给按钮注册鼠标监听器
        btnTest.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("mouseClicked--鼠标完成单击事件");
            }

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("mousePressed--鼠标按下事件");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("mouseReleased--鼠标放开事件");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("mouseEntered--鼠标进入按钮区域事件");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("mouseExited--鼠标移出按钮区域事件");
            }
        });
    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述
  • 如何区分用户单击的是鼠标左键还是右键,或者滚轮动作?
    MouseEvent类中定义了很多常量来识别鼠标动作。
    MouseEvent.BUTTON1:用来判定鼠标左击事件;
    MouseEvent.BUTTON3:用来判定鼠标右击事件;
    MouseEvent.BUTTON2:用来判定鼠标滚轮点击事件;
    在这里插入图片描述
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述

(四)键盘事件

1、键盘事件概述

键盘操作也是最常用的用户交互方式,例如键盘按下、释放等,这些操作被定义为键盘事件。Java中提供了一个KeyEvent类表示键盘事件。

2、键盘事件使用方法

处理键盘事件的监听器对象需要实现KeyListener接口或者继承KeyAdapter类;然后调用addKeyListener()方法将监听器绑定到事件源对象。

3、案例演示:演示按键事件

  • 创建KeyEventDemo
    在这里插入图片描述
package net.hw.lesson30;

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

/**
 * 功能:演示按键事件
 * 作者:华卫
 * 日期:2020年05月30日
 */
public class KeyEventDemo {
    public static void main(String[] args) {
        // 创建窗口对象
        JFrame frame = new JFrame("演示按键事件");
        // 设置窗口边界
        frame.setBounds(200, 200, 300, 200);
        // 设置屏幕居中(采用相对定位方式)
        frame.setLocationRelativeTo(null);
        // 设置窗口布局
        frame.setLayout(new FlowLayout());

        // 创建文本框对象
        JTextField txtTest = new JTextField(15);
        // 将文本框添加到窗口
        frame.add(txtTest);

        // 设置窗口可见
        frame.setVisible(true);
        // 设置默认关闭方式(关闭窗口就退出应用程序)
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // 给文本框注册按键监听器
        txtTest.addKeyListener(new KeyListener() {
            @Override
            public void keyTyped(KeyEvent e) {                
            }

            @Override
            public void keyPressed(KeyEvent e) {
                // 获取按键字符
                char keyChar = e.getKeyChar();
                // 获取按键字符的键码
                int keyCode = e.getKeyCode();
                System.out.println("按键字符:" + keyChar + "\t按键代码:" + keyCode);
            }

            @Override
            public void keyReleased(KeyEvent e) {
            }
        });

    }
}
  • 运行程序,查看结果
    在这里插入图片描述
    在这里插入图片描述
  • 说明:虽然输入的是小写字母“a”,但是键码确实对应的大写字母“A”的ASCII码“65”。

(五)动作事件

1、动作事件概述

动作事件与前面三种事件有所不同,它不代表某类事件,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭。在Java中,动作事件用ActionEvent类表示。

2、动作事件使用方法

处理动作事件的监听器对象需要实现ActionListener接口,然后调用addActionListener()方法将监听器绑定到事件源对象。

3、案例演示:登录窗口程序LoginFrame

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/howard2005/article/details/106437683