java swing事件监听_Java swing(awt):事件监听机制的实现原理+简单示例

(1)实现原理

事件监听机制的实现:

参考图:事件模型_ActionEvent

为了节省资源,系统无法对某个事件进行实时的监听。故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般。(回调函数)事件有许多,这边以按钮被按下为例。由于处理的方法函数是我们人为进行编写的,故Button是不知道所要调用的函数名是什么。对此采用的解决方法为:

Button源代码调中用接口方法,而我们的监听处理函数则必须要实现该接口(ActionListener)

这样利用多态,使得Button虽调用的为该接口的方法,但运行的则是我们new出来的对象方法。类似于Button提供了这么一个钩子,但是钩子上面是什么东西他自己并不清楚,我们只需要人为地往上面挂上我们需要的东西即可。

事件监听机制实现过程(如下图): 当事件源对象发生了某一事件后,事件信息将被打包为ActionEvent类,并发送给事件监听器。而后事件监听器将根据其内容(包括鼠标点击的位置,动作等)做出相应的处理。(自动执行actionPerformed()函数) 而实现了特定接口的事件监听器为了对事件源对象的某一特定事件进行监测,因此必须进行注册。即告知事件源对象已被监听(b.addActionListener(m))

cc5e43b22dcd640e96b14b918c2370d8.png

(2)事件监听示例1

import java.awt.*;

import java.awt.event.*;

public class TestActionEvent {

public static void main(String[] args) {

Frame f = new Frame("TestActionEent");

Button b1 = new Button("START");

Button b2 = new Button("STOP"); //创建事件源对象b2

Monitor m = new Monitor(); //创建事件监听器m

b1.addActionListener(m);

b2.addActionListener(m); // 将事件源对象b2注册到事件监听器m中,告知b2已被m所监听

b2.setActionCommand("GAME OVER!");

f.add(b1, BorderLayout.NORTH);

f.add(b2, BorderLayout.SOUTH); //将按钮b2添加到面板f

f.pack(); // 根据内容确定Frame边框大小,类似外围包装上一层

f.setVisible(true);

}

}

class Monitor implements ActionListener { //创建实现了事件监听接口ActionListener的事件监听器类Monitor

public void actionPerformed(ActionEvent e) { // 事件信息被打包在了ActionEvent e中传递过来,等待处理。

//actionPerformed()方法就是具体的处理事件的方法。

System.out.println("A Button has been pressed!\n" +

"the relative info is:" + e.getActionCommand()); // ActionCommand中默认信息为该Button的名字

}

}

(3)事件监听示例2

/*

* 事件监听的四步:

* 1.要有事件源对象:button

* 2.要发生某种事件(类):ActionEvent,封装了事件的信息

* 3.要有监听器(接口):Monitor  接到事件后进行处理

* 4.要把监听器注册到事件源对象上 b.addActionListener(mo);

* 事件与监听器一一对应

* 取决也事件源对象能添加哪种事件(注册哪种事件)

*/

import java.awt.BorderLayout;

import java.awt.Button;

import java.awt.Frame;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

public class TestActionEvent {

public static void main(String[] args) {

Frame f = new Frame("Test");

Button b = new Button("Press me");

Monitor mo = new Monitor();

b.addActionListener(mo);

f.add(b, BorderLayout.CENTER);

f.pack();

f.setVisible(true);

}

}

class Monitor implements ActionListener {

public void actionPerformed(ActionEvent e) {

System.out.println("a button has been pressed");

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值