Java swing(awt):事件监听机制的实现原理+简单示例
(1)实现原理 事件监听机制的实现: 参考图:事件模型_ActionEvent
为了节省资源,系统无法对某个事件进行实时的监听。故实现的机制是当发生某个事件后,处理代码将被自动运行,类似钩子一般。(回调函数)事件有许多,这边以按钮被按下为例。由于处理的方法函数是我们人为进行编写的,故Button是不知道所要调用的函数名是什么。对此采用的解决方法为: Button源代码调中用接口方法,而我们的监听处理函数则必须要实现该接口(ActionListener) 这样利用多态,使得Button虽调用的为该接口的方法,但运行的则是我们new出来的对象方法。类似于Button提供了这么一个钩子,但是钩子上面是什么东西他自己并不清楚,我们只需要人为地往上面挂上我们需要的东西即可。 事件监听机制实现过程(如下图): 当事件源对象发生了某一事件后,事件信息将被打包为ActionEvent类,并发送给事件监听器。而后事件监听器将根据其内容(包括鼠标点击的位置,动作等)做出相应的处理。(自动执行actionPerformed()函数) 而实现了特定接口的事件监听器为了对事件源对象的某一特定事件进行监测,因此必须进行注册。即告知事件源对象已被监听(b.addActionListener(m))
(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 {
- @Override
- public void actionPerformed(ActionEvent e) {
- System.out.println("a button has been pressed");
- }
- }
少说话 多做事