Action与ActionListener的事件处理机制及实例分析

xjtuer最好不要抄,五次作业都是去年优秀作业,被老师逮住全给0分就得不偿失了,放在这里是给大家一个思路不用再去查找很多资料,了解之后再自己总结写一写

事件处理机制的分析

swing的事件处理机制其实就是一个委托事件处理,是由事件源(组件)、事件(Event)、监听器(Listener)和 事件处理器(引发事件后的处理方式)组成

  1. 事件源

    产生事件的组件就叫事件源

  2. 事件

    事件是一个操作(通常使用各种输入设备,如键盘、鼠标等来完成)。

  3. 监听器

    包含事件处理,并负责检查事件是否发生,若发生就激活事件处理器进行处理的类叫做事件监听类,其实例就是事件监听对象。事件监听器必须实现事件监听器接口或者继承事件监听器适配类。

  4. 事件处理器

    事件处理器是一个接收事件对象并进行相应处理的方法。事件处理器包含在一个类中。

  • 任何支持GUI的操作环境都要不断地监听案件或点击鼠标这样地事件,这样的事件再报告给正在运行地程序,每个程序将决定如何对这些事件做出响应
  • 通知一个事件监听器发生了某个事件时,这个事件地相关信息会封装在一个事件对象(Event object)中,在java中,所有的事件对象最终都派生于java.util.EventObject

监听器共有四种实现方法

  • 自身类作为事件监听器
  • 外部类作为事件监听器
  • 匿名内部类作为事件监听器(也可以用lambda表达式)
  • 内部类作为事件监听器

java中AWT事件的处理机制如下:

  • 事件监听器是一个实现了监听器接口(listener interface)的类实例,如ActionListener
  • 事件源对象能够注册监听器对象并向其发送事件对象
  • 当事件发生时,事件源将事件对象发送给所有注册的监听器
  • 监听器对象再使用事件对象中的信息决定如何对事件做出相应

例如如下监听器示例:

ActionListener listener = new ...(any Class implements ActionListener);
JButton yellowButton = new JButton("btn");
btn.addActionListener(listener);

这样之后,只要按钮产生了一个"动作事件",listener对象就会得到通知,从而执行与这个事件相对应的方法

ActionListener的实现

要实现ActionListener接口,实现类就必须有一个名为actionPerformed的方法,该方法接收一个ActionEvent对象为参数

只要用户点击按钮,JButton对象就会创建一个ActionEvent对象,然后调用listener.actionPerformed(event),并传入这个事件对象。

一个事件可以有多个监听器,这样一来,只要用户点击按钮,按钮就会调用所有监听器的actionPerformed方法

public class MyListener implements ActionListener{
    
    public void actionPerformed(ActionEvent event){
		// 点击按钮后的对用操作
        System.out.println("按钮被点击了");
    }
    
}

Action的实现

  • Action接口是Swing包提供的一种用来封装命令的并将其关联到多个事件源的机制

  • 动作(Action)是封装以下内容的一个对象

    • 命令的说明(一个文本字符串和一个可选的图标)
    • 执行命令所需要的参数

Action接口中包含以下方法

void actionPerformed(ActionEvent event);
void setEnabled(boolean b);
boolean isEnabled();
void putValue(String key,Object value);
Object getValue(String key);
void addPropertyChangeListener(PropertyChangeListener listener);
void removePropertyChangeListener(PropertyChangeListener listener);
  • 第一个方法是ActionListener接口中的方法,实际上,Action接口扩展了ActionListener接口,因此,任何需要ActionListener对象的地方可以使用Action对象

  • 接下来的两个方法允许启用或者禁用这个动作,并检查这个动作当前是否启用

  • putValueGetValue方法允许存储和获取动作对象中的任意名/值对

  • 最后两个方法能够让其他对象在动作对象的属性发生变化时得到通知

需要注意,Action时一个接口,而不是一个类。实现这个类必须实现上述的七个方法,经查阅资料,发现有人提供了一个类AbstarctAction,这个类实现了除了actionPerformed方法之外的所有其他方法,我们可以直接扩展这个类,并提供一个actionPerformed方法

例:构造一个可以执行颜色改变命令的动作对象

// ColorAction.java
public class ColorAction.ja extends AbstractAction{
	public ColorAction(String name,Color c){
		putValue(Action.NAME,name);
		putValue("color",c);
		putValue(Action.SHORT_DESCRIPTION,"Set panel color to" + name.toLowerCase());
	}

	public void actionPerformed(ActionEvent event){
	Color c = (Color) getValue("color");
	buttonPanel.setBackground(c);
	}
}

实例分析

在该案例中,完成的任务是,在一个面板中加入4个按钮,程序负责监听鼠标点击了哪个按钮,并将对应的按钮显示在屏幕上

运行结果:

image-20210926213026254.png

image-20210926213034229.png

分析:

  • 在该案例中,共有四个按钮组件,每个组件都添加了不同的监听器,对应四个组件分别为btn1->btn1Action,监听器完成的任务是在监听到按钮被点击后在TextArea中显示被点击的按钮是哪一个
  • 对于本案例来说,每一个button组件为一个事件源,每一次点击即为一次事件Action,对应的btnAction对象即为监听器,负责监听button点击事件,btnAction对象内部的ActionPerformed即为对应的事件处理器,在每一次点击按钮之后事件监听器中的事件处理器即可将对应案件的表示打印在TextArea
import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class ButtonFrame extends JFrame {
    
    public static void main(String[] args) {
        var bt = new ButtonFrame();
    }

    private JPanel buttonPanel;
    private JTextArea textArea;

    public ButtonFrame() {
        setSize(300, 200);// width height
        setTitle("Action测试");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 创建按钮组件
        JButton btn1 = new JButton("W");
        JButton btn2 = new JButton("A");
        JButton btn3 = new JButton("S");
        JButton btn4 = new JButton("D");

        buttonPanel = new JPanel();
        textArea = new JTextArea();

        // 将按钮加入面板中
        buttonPanel.add(btn1);
        buttonPanel.add(btn2);
        buttonPanel.add(btn3);
        buttonPanel.add(btn4);

        // 创建相关动作
        var btn1Action = new keyAction('W');
        btn1.addActionListener(btn1Action);
        var btn2Action = new keyAction('A');
        btn2.addActionListener(btn2Action);
        var btn3Action = new keyAction('S');
        btn3.addActionListener(btn3Action);
        var btn4Action = new keyAction('D');
        btn4.addActionListener(btn4Action);

        // 将面板及文字区域加入Frame中
        add(buttonPanel);
        add(buttonPanel, BorderLayout.NORTH);
        add(textArea);
        setVisible(true);
    }
    /**
     * 监听按了哪个按钮
     */
    private class keyAction implements ActionListener {
        private char key;

        public keyAction(char key) {
            this.key = key;
        }

        public void actionPerformed(ActionEvent event) {
            System.out.println(key);
            textArea.setText("按了" + key + "键");
        }
    }
}
  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hydrion-Qlz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值