当前位置: 首页 > article >正文

Java中的事件(动作监听-ActionListener)

(一)、ActionListener接口

ActionListener接口用于处理用户界面上的动作事件,例如:按钮点击、菜单选择等。实现ActionListener接口需要重写actionPerformed(ActionEvent e)方法,该方法会在动作发生时被调用。

(二)、两种方式为按钮或者菜单等添加动作监听事件

1、 使用匿名内部类的形式

使用匿名内部类的形式为按钮添加动作监听时,每一个按钮添加的事件要写一个匿名内部类,适用于单个事件
例如:
下面有一个JFrame(MyJFrame继承JFrame)和一个测试类用于创建窗口:
MyJframe:

public class MyJFrame extends JFrame {
    JButton jtb1 = new JButton("点我啊");

    public MyJFrame() {
        this.setSize(603, 680);
        this.setTitle("按钮点击事件测试");
        this.setLayout(null);   取消默认组件的居中放置,只有取消了,组件在界面中才会按照XY轴的形式添加
        //设置按钮宽高和位置
        jtb1.setBounds(0, 0, 100, 50);

        //给按钮绑定鼠标事件
        jtb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("我被点击了");
            }
        });


        //将按钮添加到整个界面中
        this.getContentPane().add(jtb1);
        this.setVisible(true);
    }
}

重点详解:
在MyJFrame类中创建了按钮“jtb1”,然后经过简单的位置和大小设置后,给按钮绑定了鼠标动作监听事件

jtb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println("我被点击了");
            }
        });

jtb1.addActionListener 表示要给按钮jtb1 添加ActionListener事件,addActionListener()方法中的参数是ActionListener接口对象,这里将ActionListener接口的实现类对象作为参数传递进去后,addActionListener方法体中就会调用所传递的参数的actionPerformed方法,这里用到了接口多态的概念。
所以将使用该匿名内部类作为参数进行传递,然后会执行actionPerformed方法,在该方法中写入动作发生后的逻辑

测试类:

public class MyJFrameTest {
    public static void main(String[] args) {
        new MyJFrame();
    }
}

执行后打开窗口如下所示
在这里插入图片描述

当点击按钮后控制台会打印出点击后的事件
在这里插入图片描述

2、 本类实现ActionListener接口的形式

让MyJFrame实现ActionListener接口,本类中要重写接口中的所有方法,当按钮绑定事件后被点击后,会执行actionPerformed方法
例如:
下面有一个JFrame(MyJFrame继承JFrame并实现了ActionListener接口)和一个测试类用于创建窗口:
MyJframe:

public class MyJFrame extends JFrame implements ActionListener{
    JButton jtb1 = new JButton("按钮1");
    JButton jtb2 = new JButton("按钮2");

    public MyJFrame() {
        this.setSize(603, 680);
        this.setTitle("按钮点击事件测试");
        this.setLayout(null);   取消默认组件的居中放置,只有取消了,组件在界面中才会按照XY轴的形式添加
        //设置按钮宽高和位置
        jtb1.setBounds(0, 0, 100, 50);
        jtb2.setBounds(100, 0, 100, 50);

        //给按钮绑定鼠标事件
        jtb1.addActionListener(this);
        jtb2.addActionListener(this);


        //将按钮添加到整个界面中
        this.getContentPane().add(jtb1);
        this.getContentPane().add(jtb2);

        this.setVisible(true);


    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getSource()==jtb1){
            System.out.println("按钮1被点击了");

        } else if (e.getSource()==jtb2) {
            System.out.println("按钮2被点击了");
        }
    }
    
}

重点详解:
在MyJFrame类中创建了两个按钮jtb1jtb2,然后经过简单的位置和大小设置后,给两个按钮绑定了鼠标动作监听事件,jtb1.addActionListener(this);为什么传递的参数是this呢,即本类对象。
首先MyJFrame实现了ActionListener接口,然后也重写了接口中的方法actionPerformed(ActionEvent e)方法。那么MyJFrame就成为了ActionListener接口的实现类,而在addActionListener()方法中所要传递的参数本就是ActionListener接口的实现类,所以当MyJFrame实现了接口后,在按钮绑定监听事件后只需要将本类对象作为参数进行传递就行了,然后当按钮被点击后,就会调用接口的实现类(也就是本类)的对象中的actionPerformed方法。
然后e.getSource()去获得是哪个按钮,进行判断,根据不同的按钮事件进行不同的逻辑处理。

测试类:

public class MyJFrameTest {
    public static void main(String[] args) {
        new MyJFrame();
    }
}

执行后打开窗口如下所示
在这里插入图片描述
当点击按钮1会执行System.out.println(“按钮1被点击了”);
当点击按钮2会执行System.out.println(“按钮2被点击了”);
在这里插入图片描述


http://www.kler.cn/a/316922.html

相关文章:

  • 软件测试面试2024最新热点问题
  • Java设计模式面试题及参考答案
  • Java 网络编程(一)—— UDP数据报套接字编程
  • zabbix监控端界面时间与服务器时间不对应
  • 深度学习之 LSTM
  • 【2024最新】math-expression-evaluator 动态计算表达式的使用
  • 如何使用ssm实现企业文档管理系统+vue
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【Perf调测】
  • Tcping:一款实用的端口存活检测工具
  • spring自定义属性编辑器
  • 本地生活商城开发搭建 同城O2O线上线下推广
  • 为什么 Feign 要用 HTTP 而不是 RPC?
  • Dify创建自定义工具,调用ASP.NET Core WebAPI时的注意事项(出现错误:Reached maximum retries (3) for URL ...)
  • Java_Day03学习
  • 前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开
  • Java面向对象——内部类(成员内部类、静态内部类、局部内部类、匿名内部类,完整详解附有代码+案例)
  • 江协科技STM32学习- P14 示例程序(定时器定时中断和定时器外部时钟)
  • web基础—dvwa靶场(十一)CSP Bypass
  • Linux相关概念和重要知识点(6)(make、makefile、gdb)
  • SQLServer数据分页
  • Python 中的函数装饰器:理解 @property、Getter 和 Setter 方法
  • (算法)大数的进制转换
  • ESP32-WROOM-32 [创建AP站点-客户端-TCP透传]
  • PostgreSQL中的regexp_split_to_table函数详解,拆分字段为多行
  • C++之STL—vector容器进阶篇
  • C++ STL全面解析:六大核心组件之一----序列式容器(vector和List)(STL进阶学习)