Java基础学习之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事件监听内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java Swing实现坦克大战游戏

    一.引言 90坦克大战,很经典的一款游戏,当年与小伙伴一人一个手柄,搬上小板凳坐在电视机前,身体时不时跟随手柄摇晃着,时而表情严肃.眉头紧锁,时而欢呼雀跃.喜笑颜开,全身心投入到游戏中,在消灭一只只坦克.守住关卡.坦克升级.晋级通关的时候,更是手舞足蹈.击掌庆祝,如今想想也是记忆犹新.回味无穷!于是乎就我就自己用java写了一个,找一下当年的感觉,顺便虐一下电脑,嘻嘻嘻嘻嘻(ming式笑声). 二.效果图 三.实现 绘图时将这个鹰的图标用 g.drawImage 的方式绘制在界面中央最下方,然后

  • Java Swing中JList选择事件监听器ListSelectionListener用法示例

    本文实例讲述了Java Swing中JList选择事件监听器ListSelectionListener用法.分享给大家供大家参考,具体如下: 当JList中的元素被选中时,选择事件将被触发.对于JTable也是一样,你可以把它看做是多个并列的JList.那么,如果程序需要对该事件做出响应,需要以下步骤: (1)创建一个实现了 ListSelectionListener的监听器: (2)使用JList或selectionModel的addListSelectionListener添加监听器: (3

  • Java Swing 只关闭当前窗体的实现

    看到很多人都在询问怎么在java swing中只关闭当前的窗体,因此写下此文. 主界面主要是有两个JButton,一个是通过按钮事件调起另一个JFame,另一个是关闭当前窗体. 1.关闭当前窗体不能使用setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)方法,可以使用 setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 2.通过JButton事件不能使用exit(),这样会使得整个程序的窗体全部关闭,可以使

  • Java实战之基于swing的QQ邮件收发功能实现

    一.电子邮件详解 假设自己的电子邮件是me@163.com,对方的邮件是you@163.com 我们编写好文件填写好对方文件,点击发送,这些电子邮件就发出去了 而这些电子邮件被称为MUA:Mail User Agent--邮件用户代理. Email发送出去的时候,不是直接到达对方的电脑,而是先发送到MTA:Mail Transfer Agent--邮件传输代理.如:网易 Email到达MTA后,MTA会把Emain投递到邮件的最终目的MDA:Mail Delivery Agent--邮件投递代理

  • java swing 创建一个简单的QQ界面教程

    记录自己用java swing做的第一个简易界面. LoginAction.java package com.QQUI0819; import javax.swing.*; import java.awt.event.*; //首先,编写按钮癿监听器实现类 public class LoginAction implements ActionListener { private int count=0; //当前为null,创建后指向界面输入框 private JTextField ulName;

  • JavaSwing基础之Layout布局相关知识详解

    一.View layout方法 首先,还是从ViewRootImpl说起,界面的绘制会触发performMeasure.performLayout方法,而在performLayout方法中就会调用mView的layout方法开始一层层View的布局工作. private void performLayout(WindowManager.LayoutParams lp, int desiredWindowWidth, int desiredWindowHeight) { final View ho

  • Java Swing实现JTable检测单元格数据变更事件的方法示例

    本文实例讲述了Java Swing实现JTable检测单元格数据变更事件的方法.分享给大家供大家参考,具体如下: 在JTable的初级教程中往往会提到,使用TableModel的 addTableModelListener方法可以监听单元格数据的变更,在其事件处理函,数tableChanged中,可以通过e.getColumn(),e.getFirstRow(),e.getLastRow(),e.getType()来获取变更发生的位置和变更的类型(插入.更新或删除).然而该方法存在2个致命的问题

  • Java Swing窗体关闭事件的调用关系

    Java Swing的窗体和对话框的关闭事件无非就是windowClosing和windowClosed这两个方法,如果要在关闭时进行"是否退出"之类的提示或保存数据等操作时则需要用到这些方法,但到底是该用哪个方法则有一定的讲究. windowClosing用于窗体关闭时被调用,这个时候窗体还处在运行并显示当中,所以为了方便可以把这个方法称为关闭前调用的方法.值得注意的是当我们按下窗体或对话框的的右上角的关闭按钮时此方法会被调用. windowClosed用于窗体被关闭后被调用,一般当

  • Eclipse+Java+Swing实现学生成绩管理系统的实例代码

    一.系统介绍 本系统实现了用户登录,实现了对学生成绩的增删改查,实现了用户修改密码功能,采用MD5加密算法,数据库使用Mysql8.0.13,界面良好. 二.系统展示 1.登录页 2.主页面 3.查询学生成绩 4.修改学生成绩 5.添加学生成绩 6.修改系统密码 三.系统实现 Student.java package com.sjsq.model; import java.util.ArrayList; import java.util.List; /** * 学生实体类 * @author s

  • Java Swing最详细基础知识总结

    一.简介 Swing 是一个为Java设计的GUI工具包. Swing是JAVA基础类的一部分. Swing包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表. Swing提供许多比AWT更好的屏幕显示元素.它们用纯Java写成,所以同Java本身一样可以跨平台运行,这一点不像AWT.它们是JFC的一部分.它们支持可更换的面板和主题(各种操作系统默认的特有主题),然而不是真的使用原生平台提供的设备,而是仅仅在表面上模仿它们.这意味着你可以在任意平台上使用JAVA支持的任意面板.轻量级

随机推荐