Java中创建事件监听器的五种方法

2023-11-18

在Java中处理事件的办法最原始的方法如下

一.使用内部类

一个个设置Button然后创建一个内部类, 用ActionPerformed来实现按钮事件内容;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame myFrame = new ButtonFrame();
            myFrame.setTitle("Recluse");
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myFrame.setVisible(true);
        });
    }
}

class ButtonFrame extends JFrame{
    private JPanel myWindow;
    private static final int DEFAULT_WIDTH = 500;
    private static final int DEFAULT_HEIGHT = 500;

    public ButtonFrame(){
        this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        JButton greenButton = new JButton("Green");
        JButton yellowButton = new JButton("Yellow");
        JButton redButton = new JButton("Red");
        myWindow = new JPanel();
        myWindow.add(greenButton);
        myWindow.add(yellowButton);
        myWindow.add(redButton);
        this.add(myWindow);

        Colorbutton greenbut = new Colorbutton(Color.green);
        Colorbutton yellowbut = new Colorbutton(Color.yellow);
        Colorbutton redbut = new Colorbutton(Color.red);

        greenButton.addActionListener(greenbut);
        yellowButton.addActionListener(yellowbut);
        redButton.addActionListener(redbut);

    }

    private class Colorbutton implements ActionListener{
        private Color backgroundColor;

        public Colorbutton(Color c){
            backgroundColor = c;
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            myWindow.setBackground(backgroundColor);
        }
    }
    
}

二. 使用lambda表达式

但是这个方法比较繁琐,需要创建一个内部类, 其实有更简单的方法, 比如使用lambda表达式, 而不需要创建内部类, 我们可以把创建按钮和响应的部分放到一个方法里面, 如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;

public class Test {
    public static void main(String[] args) {
        EventQueue.invokeLater(()->{
            JFrame myFrame = new ButtonFrame();
            myFrame.setTitle("Recluse");
            myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            myFrame.setVisible(true);
        });
    }
}

class ButtonFrame extends JFrame{
    private JPanel myWindow;
    private static final int DEFAULT_WIDTH = 500;
    private static final int DEFAULT_HEIGHT = 500;

    public ButtonFrame(){
        myWindow = new JPanel();
        this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        myWindow.setPreferredSize(new Dimension(500,100));
        this.add(myWindow,BorderLayout.SOUTH);
        makeButton("Green", Color.GREEN);
        makeButton("Yellow",Color.YELLOW);
        makeButton("Blue",Color.BLUE);

    }

    public void makeButton(String name, Color backgroundcolor){
        JButton aButton = new JButton(name);
        myWindow.add(aButton);
        aButton.addActionListener(event->{myWindow.setBackground(backgroundcolor);});
    }

}

三. 使用匿名对象

当然使用lambda表达式肯定不是非用不可的, 以前的方法是使用匿名对象, 也是可以的:

        aButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                myWindow.setBackground(backgroundcolor);
            }
        });

四. 自身框架做事件源容器

其实可以直接用JFrame本身做事件源容器, 使ButtonFrame支持ActionListener接口, 需要把按钮定义在属性中, 然后在构造函数中添加的监听器中直接使用this 像这样:greenButton.addActionListener(this);然后在自己类中实现ActionPerformed方法, 使用Object source = e.getSource();获取到事件的更新源, 然后用判断语句来判断是哪个按钮的事件依次执行事件操作;

class ButtonFrame extends JFrame implements ActionListener{
    private JPanel myWindow;
    private static final int DEFAULT_WIDTH = 500;
    private static final int DEFAULT_HEIGHT = 500;
    JButton greenButton = new JButton("Green");
    JButton redButton = new JButton("Red");
    JButton blueButton = new JButton("Blue");

    public ButtonFrame(){
        myWindow = new JPanel();
        this.setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        myWindow.setPreferredSize(new Dimension(500,100));
        greenButton.addActionListener(this);
        redButton.addActionListener(this);
        blueButton.addActionListener(this);
        myWindow.add(greenButton);
        myWindow.add(redButton);
        myWindow.add(blueButton);
        this.add(myWindow,BorderLayout.SOUTH);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object source = e.getSource();
        if(source == greenButton) myWindow.setBackground(Color.GREEN);
        else if(source == redButton) myWindow.setBackground(Color.RED);
        else if(source == blueButton) myWindow.setBackground(Color.BLUE);
    }
}

五.使用EventHandler指定事件监听器

使用这样的方法EventHandler.create(ActionListener.class, frame, "loadData")创造一个ActionListener, 这种方法用lambda表达式就等同于event->frame.localData();
但是这个方法我还不会用呜呜呜

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中创建事件监听器的五种方法 的相关文章

随机推荐

  • PR/AE 超级变速插件Twixtor Pro 7.5.4汉化版WIN版中文使用教程

    插件介绍 Twixtor Pro汉化版 hereitis cn articleDetails 897 可以直观的调整动画祯速率 加快或减慢 调整帧顺序 为了实现 的图像品质 Twixtor通过对原始连续的帧进行变形和插入来合成它独有的新帧
  • 【CVPR 2023】FasterNet论文详解

    论文名称 Run Don t Walk Chasing Higher FLOPS for Faster Neural Networks 论文地址 https arxiv org abs 2303 03667 作者发现由于效率低下的每秒浮点运
  • 全相联映射、直接映射、组相连映射

    目录 1 主存中的块放到cache 高速缓冲存储器 中哪个位置 2 标记位 有效位 命中是什么 2 1 标记位 2 2 有效位 2 3 命中 3 全相联映射 4 直接映射 4 1优化标记位 5 组相连映射 6 课后习题 1 主存中的块放到c
  • 726-有100瓶水,其中一瓶有毒,有一种试纸...

    问题如下 100瓶水 一瓶有毒 有一种试纸 不过需要一个小时才能出结果 问最少需要几片试纸才能在一小时内找到有毒的那一瓶 答案是 7 算法思路 本地解题方案类似于布隆过滤器的算法思路 参考我的博客 大数据查重 布隆过滤器 本题的思想就是 算
  • 企业进销存管理系统(一)

    该系统是典型的MIS 管理信息系统 主要包括创建并维护后台数据库和前端应用程序的开发两个方面 练习 一 系统分析 本节是对企业进销存管理系统进行系统的分析 其中包括需求分析和可行性分析 另外 在项目计划书中将详细地描述开发背景 团队和开发环
  • dede php调用指定文章,织梦标签调用:根据特定需求调用文章的标签代码

    1 相关文章调用标签 dede likeart titlelen 30 row 10 dede likeart 表示读取10条相关文章 标题长度30个字符 2 热点文章调用标签 dede arclist orderby click titl
  • 嵌入式工程师必备:MIPI CSI-2 接口协议

    低不了的只有档次 百家号03 1500 23 https baijiahao baidu com s id 1594891152373506133 wfr spider for pc 现代社会 竞争激烈 对于手机行业 更是如此 在优胜劣汰适
  • eclipse 离线安装checkStyle

    CheckStyle 安装 在网上看了很多博客 博客写的大多是在线安装的方式 但是在国内在线安装最大的问题就是网络 很多时候别人安的好 但是到了你这里就不行 ps 很气 但是你没办法 下面我介绍的是一种离线安装的方式 首先大家解压下载的安装
  • Echars 动态生成数据与为0的数据不显示(折线图)

    1 贴个效果图 2 讲个 自己的小思路 准备自己统计的数据 如下图 代码很简单 首先我们需要一个data data里面需要什么数据 1 每日的日期 2 每日日期对应的商品名称 3 每日日期对应的商品名称销售总数量 比如 goodsName
  • C++实现——两个大数相乘

    include
  • word2013,分成两栏后文字顺序混乱的问题

    word2013默认的分栏 在一个自然段跨越一页时 会把跨越的那一部分分成两半 而我们希望它们继续在左边待着 怎么办呢 博主找了很久 终于在百度知道的一个被折叠的答案里找到了方法 这个问题是word默认的分栏符的锅 只要将其删去即可 以wo
  • 1.2安装Ubuntu20.4系统

    在NUC上装Linux 安装linux 开机进入BIOS界面 把U盘启动放在第一位 不同主板进入BIOS方法不一样 不知道可自行百度 nuc是f2 注意 一定要保证开机之前U盘是插上去的 否则看不到U盘启动项 这里我安装的Ubuntu20
  • 种春草肥禾,织数字天下

    进入3月 和春天一起到来的 还有各行各业与数智科技相触碰后所显现的勃勃生机 我们知道 十三五期间 科技成为支撑中国高质量发展的 新动能 即便是在2020年疫情影响的不利环境下 许多高新技术企业依然实现了逆势增长 再叠加 新基建 双循环等政策
  • C++中的自定义排序

    目录 前言 sort介绍 自定义排序规则 方式一 直接写bool类型cmp函数 方式二 重载运算符 gt 或 lt 方式三 在sort的cmp函数直接写规则 前言 sort用于C 中 对给定区间所有元素排序 在算法题时经常会用到sort排序
  • TabLayout源码解析和仿简书首页TabLayout效果

    初衷 想学习下源码 刚好就拿TabLayout开刀 正好产品和UI提了需求做成简书那样的效果 本来是想自己写一个的 但是ondraw里面画了几个文字textview之后 觉得可能还是在TabLayout之上二次开发来的容易 1 TabLay
  • Android性能优化系列:如何合理使用内存

    文章目录 1 Android编译器 2 内存泄漏 3 内存抖动 4 引用 5 取消部分后台服务 6 数据类型 7 自动装箱 8 Sparse数组集 9 ArrayMap 10 循环 11 枚举 12 常量 静态变量 13 字符串 14 本地
  • Vue入门【二】-- watch侦听器之普通监听与深度监听

    监听器 侦听器 侦听器是vue提供的一个简便通用的响应数据变化的方法 当需要在数据变化时执行异步或开销较大的操作时 这个方式是最有用的 监听器的写法 设有两个参数 一个是改变后的数据 一个是改变前的数据 a newVal oldVal 在监
  • AI创业江湖里的师徒帮

    https www chinaventure com cn news 82 20190708 345857 html 同门师兄弟出来创业 到中流击水 浪遏飞舟 老师们则在后方支援 成为学生们的坚实后盾 是只属于这个圈子的一道独特风景线 作者
  • 链表的认识

    目录 引入 链表的基础概念 链表的基本操作 查找节点 更新节点 插入节点 删除节点 数组和链表 引入 前面我们已经讲了重要的一种数据结构 数组 如果说数组是方便读取数据 那么今天所学习的链表便是方便写入数据的数据结构 为什么这么说呢 让我们
  • Java中创建事件监听器的五种方法

    在Java中处理事件的办法最原始的方法如下 一 使用内部类 一个个设置Button然后创建一个内部类 用ActionPerformed来实现按钮事件内容 import javax swing import java awt import j