Swing是目前Java中不可缺少的窗口工具组,是用户建立图形化用户界面(GUI)程序的 强大工具。Java Swing组件自动产生各种事件来响应用户行为。如当用户点击按钮或选择菜单项目时,Swing组件会产生一个 ActionEvent。Swing组件会产生许多事件,如ActionEvents,ChangeEvents,ItemEvents等,来响应用户的鼠标点击行为,列表框中值的改变,计时器的开始计时等行为。在Java Swing编程中,通过注册监听器,我们可以监听事件源产生的事件,从而在事件处 理程序中处理我们所需要处理的用户行为。

Java Swing中处理各组件事件的一般步骤是:

1. 新建一个组件(如JButton)。

2. 将该组件添加到相应的面板(如JPanel)。

3. 注册监听器以监听事件源产生的事件(如通过ActionListener来响应用户点击按钮)。

4. 定义处理事件的方法(如在ActionListener中的actionPerformed中定义相应方法)。

以上步骤我们可以用多种方法实现。但人们通常用二种方法。第一种方法是只利用一个监听器以及多个if语句来决定是哪个组件产生的事件;第二种方法是使用多个内部类来响应不同组件产生的各种事件,其具体实现又分两种方式,一种是匿名内部类,一种是一般内部类。

为了说明如何使用上述三种方法实现事件的处理方法,我们建立一个简单的应用程序。该程序界面有两个按钮,当用户点击相应的按钮,就会弹出一个对话框显示相应的内容。通过这个简单程序,你可以实现自己更多、更复杂的用户界面程序。

首先,我们利用单个监听器来实现该程序。我们定义一个名为Simple1的类来包括所有代码。所有的用户行为(如点击按钮)由一个监听器SimpleListenner中的actionPerformed方法来处理。以下是代码:

/**

* Simple1.java - 处理事件的第一种方法

* 在这个例子中,利用一个ActionListener来监听事件源产生的事件

* 用一些if语句来决定是哪个事件源

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Simple1

{

private static JFrame frame; // 定义为静态变量以便main使用

private static JPanel myPanel; // 该面板用来放置按钮组件

private JButton button1; // 这里定义按钮组件

private JButton button2; // 以便让ActionListener使用

public Simple1() // 构造器, 建立图形界面

{

// 新建面板

myPanel = new JPanel();

// 新建按钮

button1 = new JButton("按钮1"); // 新建按钮1

button2 = new JButton("按钮2");

SimpleListener ourListener = new SimpleListener();

// 建立一个actionlistener让两个按钮共享

button1.addActionListener(ourListener);

button2.addActionListener(ourListener);

myPanel.add(button1); // 添加按钮到面板

myPanel.add(button2);

}

private class SimpleListener implements ActionListener

{

/**

* 利用该内部类来监听所有事件源产生的事件

* 便于处理事件代码模块化

*/

public void actionPerformed(ActionEvent e)

{

// 利用getActionCommand获得按钮名称

// 也可以利用getSource()来实现

// if (e.getSource() ==button1)

String buttonName = e.getActionCommand();

if (buttonName.equals("按钮1"))

JOptionPane.showMessageDialog(frame,

"按钮1 被点击");

else if (buttonName.equals("按钮2"))

JOptionPane.showMessageDialog(frame,

"按钮2 被点击");

else

JOptionPane.showMessageDialog(frame,

"Unknown event" );

}

}

public static void main(String s[])

{

Simple1 gui = new Simple1(); // 新建Simple1组件

frame = new JFrame("Simple1"); // 新建JFrame

// 处理关闭事件的通常方法

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e)

{System.exit(0);} });

frame.getContentPane().add(myPanel);

frame.pack();

frame.setVisible(true);

}

}

让我们来看看以上代码是如何工作的。在main方法中,我们定义了一个JFrame,然后将面板Jpanel添加到窗体中,该面板包括两个按钮。相应的变量Frame,button1,button2定义在程序的开头部分。

在程序入口main方法中,首先新建Simple1组件,通过构造器建立用户GUI,定义一个面板Jpanle,,增加两个按钮,然后利用 JButton.addActionListerner将两个按钮加入到一个活动监听器SimpleLister中,最后,两个按钮添加到面板。当GUI 建立后,我们将面板添加到窗体并显示结果。当用户点击按钮时,程序调用actionPerformed方法,通过if语句来判断是哪一个按钮被点击,然后在对话框中显示相应的内容。

利用一个监听器来处理事件的缺点是,当程序比较复杂时,需要一大串的if 语句来实现,程序代码较难阅读与维护。当然,如果处理的事件较少,这种方式比较简单。

通过使用匿名内部类可以解决上述存在的问题。使用简单的匿名内部类作为addActionListener的变量即可。以下是实现代码:

/**

* Simple2.java - 处理事件的第二种方法

* 在这个例子中,利用匿名内部类来监听每一个事件源产生的事件

* 避免使用一些if语句来决定是哪个事件源

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Simple2

{

private static JFrame frame; // 定义为静态变量以便main使用

private static JPanel myPanel; // 该面板用来放置按钮组件

private JButton button1; // 这里定义按钮组件

private JButton button2; // 以便让ActionListener使用

public Simple2() // 构造器, 建立图形界面

{

// 新建面板

myPanel = new JPanel();

// 新建按钮

button1 = new JButton("按钮1"); // 新建按钮1

button2 = new JButton("按钮2");

// 每一个事件源需要一个监听器

// 定义一个匿名内部类来监听事件源产生的事件

button1.addActionListener(

new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

JOptionPane.showMessageDialog(frame,"按钮1 被点击");

}

}

);

button2.addActionListener(

new ActionListener()

{

public void actionPerformed(ActionEvent e)

{

JOptionPane.showMessageDialog(frame,"按钮2 被点击");

}

}

);

myPanel.add(button1); // 添加按钮到面板

myPanel.add(button2);

}

public static void main(String s[])

{

Simple2 gui = new Simple2(); // 新建Simple2组件

frame = new JFrame("Simple2"); // 新建JFrame

// 处理关闭事件的通常方法

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e)

{System.exit(0);} });

frame.getContentPane().add(myPanel);

frame.pack();

frame.setVisible(true);

}

}

使用匿名内部类同样存在许多另外的问题。首先,根据组件在代码中被定义的不同位置,类的定义以及处理事件的代码将分散在程序的各个部分,不是集中在一块,同样不便于阅读与维护。各事件的处理全部由嵌套的程序块组成,视觉上很难定位程序代码。如果事件处理程序比较复杂,内部类中的代码将变得很长,你将找不到相应的组件定义位置。最后,当工具栏、菜单栏目等需要处理同样的用户行为时,该方法将使代码更难维护。

我们使用一般的命名内部类可以解决以上许多问题。所有的事件处理方法都集中在一块,并且都具有有意义的名称,程序非常容易阅读与维护。单个的事件处理程序也可以被工具栏、菜单栏等重复使用,

以下是实现代码:

/**

* Simple3.java - 处理事件的第三种方法

* For this example, we will use inner member classes to

* 在这个例子中,利用一般内部类来监听每个事件源产生的事件

* 该方法避免了第二种方法中由于使用匿名内部类而导致的代码混乱

* 便于集中处理事件代码

* 每一个Hander可以被工具栏或菜单多次使用

*/

import java.awt.*;

import java.awt.event.*;

import javax.swing.*;

public class Simple3

{

private static JFrame frame; // 定义为静态变量以便main使用

private static JPanel myPanel; // 该面板用来放置按钮组件

private JButton button1; // 这里定义按钮组件

private JButton button2; // 以便让ActionListener使用

// 利用一般内部类来监听每一个事件源产生的事件如(button1, button2)

private class Button1Handler implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

JOptionPane.showMessageDialog(frame,"按钮1 被点击");

}

}

private class Button2Handler implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

JOptionPane.showMessageDialog(frame,"按钮2 被点击");

}

}

public Simple3() // // 构造器, 建立图形界面

{

// 新建面板

myPanel = new JPanel();

// 新建按钮

button1 = new JButton("按钮1"); // 新建按钮1

button2 = new JButton("按钮2");

// 对每一个组件注册监听内部类

button1.addActionListener(new Button1Handler());

button2.addActionListener(new Button2Handler());

myPanel.add(button1); // 添加按钮到面板

myPanel.add(button2);

}

public static void main(String s[])

{

Simple3 gui = new Simple3(); // 新建Simple3组件

frame = new JFrame("Simple3"); // 新建JFrame

// 处理关闭事件的通常方法

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent e)

{System.exit(0);} });

frame.getContentPane().add(myPanel);

frame.pack();

frame.setVisible(true);

}

}

java的actionlistener_Java swing: 实现ActionListener监听器的三种途径相关推荐

  1. java反射之获取class对象,Java之反射机制(获取Class对象的三种方式)

    Java之反射机制(获取Class对象的三种方式) 开发工具与关键技术:MyEclipse 10,java 作者:刘东标 撰写时间:2019-06-14 如何得到各个字节码对应的实例对象? 每个类被加 ...

  2. JAVA中几种循环结构的表示_本文通过实例讲解给大家介绍Java中for、while、do while三种循环语句的区别,具体详情如下所示:第一种:for循环 循环结构for语句的格式...

    本文通过实例讲解给大家介绍Java中for.while.do while三种循环语句的区别,具体详情如下所示: 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后 ...

  3. JS基础-Java Class类以及获取Class实例的三种方式

    JS基础-Java Class类以及获取Class实例的三种方式 由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名.包名.父类.实现的接口. ...

  4. JAVA 通过value获取Map中key的三种方法

    JAVA 通过value获取Map中key的三种方法 简介 方法描述 循环法 Stream方法 Apache Commons Collections的BidiMap 总结 简介 我们都知道Map是存放 ...

  5. 定义监听器的三种方法

    用监听器去处理按钮上的动作.下面都采用了匿名内部类来实现代码. 给出同一个例子的三段代码 1.常规的一个按钮设置一个监听器,注册一个按钮 2.只定义一个内部监听器(定义了一个新的类),注册给四个按钮, ...

  6. java 异步事件_处理异步事件的三种方式

    在网站开发中,异步事件是项目必然需要处理的一个环节,也因为前端框架的兴起,通过框架实现的 SPA 已经是快速建构网站的标配了,一部获取数据也就成了不可或缺的一环:本文来就讲一讲 JavaScript ...

  7. java 不知道类名_Java 中获取类名的三种方法,你知道几种?

    之前我们分享过Java高级篇--深入浅出Java类加载机制这篇文章,今天来带你了解获取类名的三种方法. 获取类名的方法 Java 中获取类名的方式主要有以下三种. getName() 返回的是虚拟机里 ...

  8. java多线程实现表复制_Java多线程的三种实现方式

    今天简单说一下Java三种多线程实现方式和区别,主要有实现Runnable.Callable和继承Thread三种方式. 实现Runnable的方式 这种方式比较常用,当我们的线程类有继承其他的类的情 ...

  9. java中有scoreframe类型嘛_java构造函数的三种类型总结

    我们说构造函数能处理参数的问题,但其实也要分三种情况进行讨论.目前有三种类型:无参.有参和默认.根据不同的参数情况,需要我们分别进行构造函数的讨论.这里重点是无参构造函数的初始化也要分两种方法进行分析 ...

最新文章

  1. JDK中的坑:JDK中这些方法的bug你不要踩
  2. const的用法,特别是用在函数后面
  3. 清除扇区和低格哪个好_C++入门篇(四十五),结点删除与链表的清除
  4. Oracle数据库的一些常用命令
  5. 2020-12-5(操作系统---设备管理)
  6. Spring及SpringBoot @Async配置步骤及注意事项
  7. [开源]jquery.ellipsis根据宽度(不是字数)进行内容截断,支持多行内容
  8. python代码加密解密_在python中加密 – 在Javascript中解密
  9. python实现多人聊天udp_python—多任务版udp聊天机器人
  10. java父类shape_为什么该父类无法调用其子类.__ShapeCircle_public_perimeter_getType_shapej__169IT.COM...
  11. as_hash ruby_Hash.merge(other_hash)方法与Ruby中的示例
  12. android get width单位是什么意思,浅析Android中getWidth()和getMeasuredWidth()的区别
  13. centos 6.5 x64 上安装mariadb10
  14. 为什么 scrum 开发人员是一个 T-形的人 ?
  15. 半导体八大工艺流程图_半导体之光刻胶,看五大龙头谁能迈出国产化第一步?...
  16. python psutil 进行系统管理 no.2
  17. SparkSQL简单教程
  18. Springboot+Mybatis查询三级类目demo
  19. Robo 3T显示MongoDB数据时区晚8小时问题
  20. BP神经网络实现实例1曲线拟合

热门文章

  1. automatic 和 noautomatic区别
  2. Python实用技巧:两个不同列表给出相似度(int、str类型)
  3. android设置自动旋转屏幕,android怎样实现关闭系统自动旋转屏幕时能够自动横竖屏...
  4. “图解服务器端网络架构”小结
  5. 你领证了吗?各地2022上半年软考证书发放中...
  6. web.xm配置详解
  7. Notability for Mac(备注笔记软件)
  8. android p矢量壁纸,华为Mate20系列14张高清壁纸“极致AI!”
  9. 火币、Nervos联合宣布打造新一代金融基础公链
  10. Python的自学之路:Python基础(一)