Java基础学习之Swing事件监听

 更新时间:2021年05月26日 08:55:18   作者:一腔诗意醉了酒  
今天学习java的Swing库,创建桌面应用的时候,突然发现有些按钮需要特定的功能响应,故来研究一番Swing的事件监听,文中有非常详细的介绍及代码示例,需要的朋友可以参考下

一、初始代码架构

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


public class Btn extends JFrame{
    public static void main(String []args){
        JFrame f = new JFrame("事件监听测试");
        f.setBounds(0,0,300,400);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                f.setVisible(false);
                f.dispose();
                System.exit(0);
            }
        });
        Container page = f.getContentPane();
        page.setLayout(new FlowLayout());
        JButton btn = new JButton("打印");
        page.add(btn);
        f.setVisible(true);
    }
    

}

运行的结果

在这里插入图片描述

二、需求分析

想要点击按钮的时候在终端打印一行信息(比如"按钮被点击")

产品爸爸,提了新需求,不能实现也要创造办法实现的啦

2.1 写监听器

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


public class Btn{
    public static void main(String []args){
        JFrame f = new JFrame("事件监听测试");
        f.setBounds(0,0,300,400);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                f.setVisible(false);
                f.dispose();
                System.exit(0);
            }
        });
        Container page = f.getContentPane();
        page.setLayout(new FlowLayout());
        JButton btn = new JButton("打印");

        /**
         * 事件监听的使用步骤:
         * 1. 创建监听听
         * 2. 将监听器注册到按钮上
         * 
         */
        btnListener bl = new btnListener();
        btn.addActionListener(bl);
        page.add(btn);
        f.setVisible(true);
    }

    
    

}

class btnListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            System.out.println("按钮被点击了----");
        }
    }

点击按钮的结果

在这里插入图片描述 

2.2 发现问题

中规中矩地实现监听器地话,发现要另外写一个类实现ActionListener 接口地方法,使得代码架构显得比较臃肿。

2.3 使用匿名内部类优化代码

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


public class Btn{
    public static void main(String []args){
        JFrame f = new JFrame("事件监听测试");
        f.setBounds(0,0,300,400);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                f.setVisible(false);
                f.dispose();
                System.exit(0);
            }
        });
        Container page = f.getContentPane();
        page.setLayout(new FlowLayout());
        JButton btn = new JButton("打印");

        /**
         * 事件监听的使用步骤:
         * 1. 创建监听听
         * 2. 将监听器注册到按钮上
         * 
         */
        ActionListener bl = new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e){
                System.out.println("匿名内部类优化----");
            }
        };

        btn.addActionListener(bl);
        page.add(btn);
        f.setVisible(true);
    }

    
    

}

class btnListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            System.out.println("按钮被点击了----");
        }
    }

在这里插入图片描述

2.4 优化完之后发现还是不是很优雅

因为每次监听都有重复代码

@Override
 public void actionPerformed(ActionEvent e){
     System.out.println("匿名内部类优化----");
 } 

2.5 使用Lambda表达式再优化

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


public class Btn{
    public static void main(String []args){
        JFrame f = new JFrame("事件监听测试");
        f.setBounds(0,0,300,400);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                f.setVisible(false);
                f.dispose();
                System.exit(0);
            }
        });
        Container page = f.getContentPane();
        page.setLayout(new FlowLayout());
        JButton btn = new JButton("打印");

        /**
         * 事件监听的使用步骤:
         * 1. 创建监听听
         * 2. 将监听器注册到按钮上
         * 
         */
        // ActionListener bl = new ActionListener(){
        //     @Override
        //     public void actionPerformed(ActionEvent e){
        //         System.out.println("匿名内部类优化----");
        //     }
        // };

        // btn.addActionListener(bl);
        btn.addActionListener((e)->{
            System.out.println("使用Lambda表达式优化");
        });
        page.add(btn);
        f.setVisible(true);
    }

    
    

}

class btnListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            System.out.println("按钮被点击了----");
        }
    }

结果

在这里插入图片描述

2.6 最终的代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Btn{
    public static void main(String []args){
        JFrame f = new JFrame("事件监听测试");
        f.setBounds(0,0,300,400);
        f.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                f.setVisible(false);
                f.dispose();
                System.exit(0);
            }
        });
        Container page = f.getContentPane();
        page.setLayout(new FlowLayout());
        JButton btn = new JButton("打印");
        
        btn.addActionListener((e)->{
            System.out.println("使用Lambda表达式优化");
        });
        page.add(btn);
        f.setVisible(true);
    }
}

三、ActionListener接口源码

/*
 * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.awt.event;

import java.util.EventListener;

/**
 * The listener interface for receiving action events.
 * The class that is interested in processing an action event
 * implements this interface, and the object created with that
 * class is registered with a component, using the component's
 * {@code addActionListener} method. When the action event
 * occurs, that object's {@code actionPerformed} method is
 * invoked.
 *
 * @see ActionEvent
 * @see <a href="https://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html" rel="external nofollow" >How to Write an Action Listener</a>
 *
 * @author Carl Quinn
 * @since 1.1
 */
public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     * @param e the event to be processed
     */
    public void actionPerformed(ActionEvent e);

}

到此这篇关于Java基础学习之Swing事件监听的文章就介绍到这了,更多相关Swing事件监听内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Maven清理java项目中未使用到 jar 依赖包的方法

    Maven清理java项目中未使用到 jar 依赖包的方法

    本文主要介绍了Maven清理java项目中未使用到 jar 依赖包的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02
  • spring boot 静态资源处理方法

    spring boot 静态资源处理方法

    本篇文章主要介绍了spring boot 静态资源处理方法。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • Java实体类中Set按照对象的某个字段对set排序

    Java实体类中Set按照对象的某个字段对set排序

    这篇文章主要介绍了Java实体类中Set按照对象的某个字段对set排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-06-06
  • 详解JAVA类加载机制(推荐)

    详解JAVA类加载机制(推荐)

    这篇文章主要介绍了JAVA类加载机制的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • springboot集成shiro自定义登陆过滤器方法

    springboot集成shiro自定义登陆过滤器方法

    这篇文章主要介绍了springboot集成shiro自定义登陆过滤器方法,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • java自定义拦截器用法实例

    java自定义拦截器用法实例

    这篇文章主要介绍了java自定义拦截器用法,实例分析了java自定义拦截器的实现与使用技巧,需要的朋友可以参考下
    2015-06-06
  • Java中的synchronized 优化方法之锁膨胀机制

    Java中的synchronized 优化方法之锁膨胀机制

    这篇文章主要介绍了Java中的synchronized 优化方法之锁膨胀机制,锁膨胀机制是提升 synchronized 性能最有利的方法之一,下面我们就来看看什么事锁膨胀及锁膨胀的各种细节
    2022-05-05
  • java实现手写一个简单版的线程池

    java实现手写一个简单版的线程池

    有些人可能对线程池比较陌生,并且更不熟悉线程池的工作原理。本文就来手写一个简单版的线程池,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Spring手动生成web.xml配置文件过程详解

    Spring手动生成web.xml配置文件过程详解

    这篇文章主要介绍了Spring手动生成web.xml配置文件过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • java stream使用指南之sorted使用及进阶方式

    java stream使用指南之sorted使用及进阶方式

    这篇文章主要介绍了java stream使用指南之sorted使用及进阶方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05

最新评论