在此列举四种方法:

  1. 自身类实现ActionListener接口,作为事件监听器

  2. 通过匿名类处理

  3. 通过内部类处理

  4. 通过外部类处理

下面依次介绍:

第一种:自身类实现ActionListener接口,作为事件监听器。

这种方法是最基本的,也是初学者经常使用的,我当初即是如此。

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

public class EventListener1 extends JFrame
implements ActionListener {

private JButton btBlue, btDialog;

// 构造方法

public EventListener1() {

// 设置标题栏内容

setTitle("Java GUI 事件监听处理");

// 设置初始化窗口位置

setBounds(100, 100, 500, 350);

// 设置窗口布局

setLayout(new FlowLayout());

// 创建按钮对象

btBlue = new JButton("蓝色");

// 将按钮添加事件监听器

btBlue.addActionListener(this);

// 创建按钮对象

btDialog = new JButton("弹窗");

// 将按钮添加事件监听器

btDialog.addActionListener(this);

// 把按钮容器添加到JFrame容器上

add(btBlue);

add(btDialog);

// 设置窗口可视化

setVisible(true);

// 设置窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//
***************************事件处理***************************

@Override

public void actionPerformed(ActionEvent e)
{

// 判断最初发生Event事件的对象

if (e.getSource() == btBlue) {

// 获得容器

Container c = getContentPane();

// 设置容器背景颜色

c.setBackground(Color.BLUE);

}

else if (e.getSource() == btDialog)
{

// 创建JDialog窗口对象

JDialog dialog = new JDialog();

dialog.setBounds(300, 200, 400,
300);

dialog.setVisible(true);

}

}

//
***************************主方法***************************

public static void main(String[] args)
{

new EventListener1();

}

}

 
 

第二种,通过匿名类处理。

这是比较好的一种方法,我是在2011年开始使用这种方法的。

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import
java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

public class EventListener2 extends JFrame
{

private JButton btBlue, btDialog;

// 构造方法

public EventListener2() {

// 设置标题栏内容

setTitle("Java GUI 事件监听处理");

// 设置初始化窗口位置

setBounds(100, 100, 500, 350);

// 设置窗口布局

setLayout(new FlowLayout());

// 创建按钮对象

btBlue = new JButton("蓝色");

// 添加事件监听器(此处即为匿名类)

btBlue.addActionListener(new ActionListener()
{

// 事件处理

@Override

public void actionPerformed(ActionEvent e)
{

// 获得容器,设置容器背景颜色

Container c = getContentPane();

c.setBackground(Color.BLUE);

}

});

// 创建按钮对象,并添加事件监听器

btDialog = new JButton("弹窗");

btDialog.addActionListener(new
ActionListener() {

// 事件处理

@Override

public void actionPerformed(ActionEvent e)
{

// 创建JDialog窗口对象

JDialog dialog = new JDialog();

dialog.setBounds(300, 200, 400,
300);

dialog.setVisible(true);

}

});

// 把按钮容器添加到JFrame容器上

add(btBlue);

add(btDialog);

// 设置窗口可视化

setVisible(true);

// 设置窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//
***************************主方法***************************

public static void main(String[] args)
{

new EventListener2();

}

}

 

第三种:通过内部类处理。

该种方法更符合面向对象编程的思想。

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import
java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

public class EventListener3 extends JFrame
{

private JButton btBlue, btDialog;

// 构造方法

public EventListener3() {

// 设置标题栏内容

setTitle("Java GUI 事件监听处理");

// 设置初始化窗口位置

setBounds(100, 100, 500, 350);

// 设置窗口布局

setLayout(new FlowLayout());

// 创建按钮对象

btBlue = new JButton("蓝色");

// 添加事件监听器对象(面向对象思想)

btBlue.addActionListener(new
ColorEventListener());

btDialog = new JButton("弹窗");

btDialog.addActionListener(new
DialogEventListener());

// 把按钮容器添加到JFrame容器上

add(btBlue);

add(btDialog);

// 设置窗口可视化

setVisible(true);

// 设置窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//
内部类ColorEventListener,实现ActionListener接口

class ColorEventListener implements
ActionListener {

@Override

public void actionPerformed(ActionEvent e)
{

Container c = getContentPane();

c.setBackground(Color.BLUE);

}

}

//
内部类DialogEventListener,实现ActionListener接口

class DialogEventListener implements
ActionListener {

@Override

public void actionPerformed(ActionEvent e)
{

// 创建JDialog窗口对象

JDialog dialog = new JDialog();

dialog.setBounds(300, 200, 400,
300);

dialog.setVisible(true);

}

}

//
***************************主方法***************************

public static void main(String[] args)
{

new EventListener3();

}

}

 

第四种:通过外部类处理

这种我个人不常用。

import java.awt.Color;

import java.awt.Container;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import
java.awt.event.ActionListener;

import javax.swing.JButton;

import javax.swing.JDialog;

import javax.swing.JFrame;

public class EventListener4 extends JFrame
{

private JButton btBlue, btDialog;

// 构造方法

public EventListener4() {

// 设置标题栏内容

setTitle("Java GUI 事件监听处理");

// 设置初始化窗口位置

setBounds(100, 100, 500, 350);

// 设置窗口布局

setLayout(new FlowLayout());

// 创建按钮对象

btBlue = new JButton("蓝色");

// 将按钮添加事件监听器

btBlue.addActionListener(new
ColorEventListener(this));

// 创建按钮对象

btDialog = new JButton("弹窗");

// 将按钮添加事件监听器

btDialog.addActionListener(new
DialogEventListener());

// 把按钮容器添加到JFrame容器上

add(btBlue);

add(btDialog);

// 设置窗口可视化

setVisible(true);

// 设置窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

}

//
***************************主方法***************************

public static void main(String[] args)
{

new EventListener4();

}

}

//
外部类ColorEventListener,实现ActionListener接口

class ColorEventListener implements
ActionListener {

private EventListener4 el;

ColorEventListener(EventListener4 el)
{

this.el = el;

}

@Override

public void actionPerformed(ActionEvent e)
{

Container c = el.getContentPane();

c.setBackground(Color.BLUE);

}

}

//
外部类DialogEventListener,实现ActionListener接口

class DialogEventListener implements
ActionListener {

@Override

public void actionPerformed(ActionEvent e)
{

// 创建JDialog窗口对象

JDialog dialog = new JDialog();

dialog.setBounds(300, 200, 400,
300);

dialog.setVisible(true);

}

}

你可能注意到为什么我写了两个监听事件,就是加以区分这些方法的区别:

第一种的监听处理部分,如果有多个(我就写过三十多个的事件监听,包含菜单栏按钮事件监听和工具栏按钮事件监听),那就需要一个个去判断,从理论上说是影响程序速度的。

第二种和第三种比较常用,如果程序的监听事件比较少,可以用第二种,匿名类很合适。

第三种符合面向对象编程(可以设置内部类只提供自身类使用,而且方便使用自身类的资源),尤其是适合多个监听事件的处理,当然也适合第二种方法情况。

第四种是外部类,如果多个监听事件相同,就可以选用此种方法。

个人愚见:建议初学者掌握这四种方法,侧重于第二、三种。怎么学不重要,重要的是达到目的,使自己的GUI编程运用自如。多编程,多思考,提升编程思想;多看别人的代码,取其精华,有很大帮助!

java中的四种监听类用法的更多相关文章

  1. 关于JAVA中事件分发和监听机制实现的代码实例-绝对原创实用

    http://blog.csdn.net/5iasp/article/details/37054171 文章标题:关于JAVA中事件分发和监听机制实现的代码实例 文章地址: http://blog.c ...

  2. JAVA基础学习之throws和throw的区别、Java中的四种权限、多线程的使用等(2)

    1.throws和throw的区别 throws使用在函数外,是编译时的异常,throw使用在函数内,是运行时的异常 使用方法 public int method(int[] arr) throws ...

  3. JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

    简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...

  4. Java中的四种引用

    引用定义 实际上,Java中存在四种引用,它们由强到弱依次是:强引用.软引用.弱引用.虚引用.下面我们简单介绍下这四种引用: 强引用(Strong Reference):通常我们通过new来创建一个新 ...

  5. JAVA中的四种JSON解析方式详解

    JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...

  6. Java 中的四种引用

    1.强引用(Strong Reference)在 Java 中四种引用中是“最强”的,我们平时通过 new 关键字创建的对象都属于强引用,如下面的代码: Person person = new Per ...

  7. Java 中的四种引用及垃圾回收策略

    Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...

  8. Java中的四种内部类

    Java中有四种内部类: 成员内部类:定义在另一个类(外部类)的内部,而且与成员属性和方法平级,故称成员内部类.类比于外部类的非静态方法,如果用static修饰就变成了静态内部类 静态内部类:使用st ...

  9. 简述Java中Http/Https请求监听方法

    一.工欲善其事必先利其器 做Web开发的人总免不了与Http/Https请求打交道,很多时候我们都希望能够直观的的看到我们发送的请求参数和服务器返回的响应信息,这个时候就需要借助于某些工具啦.本文将采 ...

随机推荐

  1. [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]

    四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...

  2. Redis-CAP定理和BASE理论(二)

    CAP理论概述 1998 年来自柏克莱加州大学的计算机科学家 埃里克.布鲁尔(Eric Brewer) 提出分布式系统的三个基本指标:Consistency(一致性).Availability(可用性 ...

  3. JS 中检测数组的四种方法

    今天和大家分享一下 JS 中检测是不是数组的四种方法,虽然篇幅不长,不过方法应该算是比较全面了. 1. instanceof 方法 instanceof 用于检测一个对象是不是某个类的实例,数组也是一 ...

  4. OpenStack Identity API v3 extensions (CURRENT)

    Table Of Contents Identity API v3 extensions (CURRENT) OS-ENDPOINT-POLICY API Associate policy and e ...

  5. 【Leetcode 做题学算法周刊】第七期

    首发于微信公众号<前端成长记>,写于 2020.01.15 背景 本文记录刷题过程中的整个思考过程,以供参考.主要内容涵盖: 题目分析设想 编写代码验证 查阅他人解法 思考总结 目录 12 ...

  6. 清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)

    在清晰架构(Clean Architecture)中,应用程序的每一层(用例,数据服务和域模型)仅依赖于其他层的接口而不是具体类型. 在运行时,程序容器¹负责创建具体类型并将它们注入到每个函数中,它使 ...

  7. kubernetes concepts -- Replication Controller

    Edit This Page ReplicationController NOTE: A Deployment that configures a ReplicaSet is now the reco ...

  8. Sigmoid非线性激活函数,FM调频,胆机,HDR的意义

    前几天家里买了个二手车子,较老,发现只有FM收音机,但音响效果不错,车子带蓝牙转FM,可以手机蓝牙播放音乐,但经过几次转换以及对FM的质疑,所以怀疑音质是否会剧烈下降,抱着试试的态度放了一个手机上的音 ...

  9. spring boot 的 userRepository无法注入的问题

    No qualifying bean of type 'xxx.xxx.xxx' available: expected at least 1 bean which qualifies as auto ...

  10. docker创建mysql容器,并挂载数据+配置

    新建:/my/mysql/my.cnf (准备挂载配置文件用) 将以下内容拷贝进去(或者启动一个docker的mysql,并且把/etc/mysql/my.cnf中的内容拷贝出来) # Copyrig ...