大话Java事件监听模型

来源:互联网 发布:小型全自动制丸机淘宝 编辑:程序博客网 时间:2024/05/14 04:48

Java编程中,事件监听模型是我们经常用到的一种程序设计模式,最直接的比如各种监听器,当然事件监听模式并不只是指各种监听器,还可以扩展到更多的我们平时的程序设计之中。接下来即谈谈事件监听模型中的主要概念!



什么是事件?

    事件的定义有很多,无权威之谈,大家择其一能较深刻的理解足矣。例如:改变对象的状态即被称为事件,即事件描述源的状态发生变化。回顾我们在Swing编程中,用户点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面都可被视为产生了事件。

    还有在Socket通信中,客户端接收到一条来自服务器的消息,也可以被视为发生了事件,然后触发事件处理类的执行,例如将其显示到界面TextArea上,这样做的好处是可以将通讯模块和界面模块分离,减少代码之间的耦合度,利于项目的延展性能。

 

有哪些事件的类型?

    前台事件 - 这些事件需要用户的直接互动。它们是由在图形用户界面中人与图形组件交互的结果而产生的。例如,点击一个按钮,移动鼠标,通过键盘输入一个字符,从列表中选择一个项目,滚动页面等。

    后台事件 - 这些事件需要追踪用户的交互,它们被称为后台事件。操作系统的中断,硬件或软件故障,计时器过期,操作完成都是后台事件的例子。

 

Java事件的生命周期

Java事件和万事一样有其生命周期,会产生,当然也就会消亡。


 

什么是事件处理?

    事件处理是一种机制,如果一个事件发生时,它控制该事件,并且决定应该会发生什么。这种机制具有被称为事件处理程序的代码,当一个事件发生时,它是可执行的。Java 使用代理事件模型来处理事件。该模型定义了标准的机制来生成和处理事件。代理事件模型具有下列主要参与者:

    事件源 - 源是一个对象,事件发生在该对象上。源负责提供发生事件的信息给它的处理器。Java 提供源对象的类。

事件监听器 - 它也被称为作为事件处理。监听器负责产生对一个事件的响应。从 Java 实现的角度来看,监听器也是一个对象。监听器等待直到它接收到一个事件。一旦收到该事件,监听器进程的事件就返回。

 

事件监听模型的简单总结

    在Swing编程中事件处理模型的好处是,用户界面逻辑完全从生成事件逻辑中分开。用户界面元素能够把事件的处理委派给一段单独的代码。在这个模型中,监听器需要用事件源对象注册,以便监听器能够接收事件通知。这是一个有效的处理事件的方式,因为这些事件通知只发送给那些想要接收它们的监听器。

 

举个例子,借鉴事件监听模型,重写画图板


新创建的画图板,视线一个坐标事件监听器,当获得新的坐标时候,通过坐标事件实现类来完成诸如画直线、矩形、圆等图形的操作,当然,各位也可以进行更多方面的拓展。

 

第一步:

首先定义坐标事件监听器的接口,这个接口规定了具体的事件处理器所必须重写的处理接收到坐标的方法,代码如下:

public interface Xy {public void Coordinate(int x,int y,int x1,int y1);}

第二步:

 编写坐标事件的实现类,我们这里即用接收到的坐标画出英国的米字旗!

public class Myline implements Xy{Graphics g;public Myline(){System.out.println("g:"+MyFrame.g);g=MyFrame.g;}public void Coordinate(int x, int y, int x1, int y1) {Graphics2D g2 = (Graphics2D) g;g2.setStroke(new BasicStroke(5));g2.setColor(Color.red);g2.drawLine(x, y, x1, y1);g2.drawLine(x, (y+y1)/2, x1, (y+y1)/2);g2.drawLine((x+x1)/2, y, (x+x1)/2, y1);g2.drawLine(x, y1, x1, y);}}


第三步:

 将坐标事件监听器注册给坐标事件生产者,本例中,即给我们界面添加的MouseListener的实现类,在实现类中获取到坐标。

public class Mylistener extends MouseAdapter{int x,y,x1,y1;private List<Xy> listeners=new ArrayList();public void mousePressed(MouseEvent v) {x=v.getX();y=v.getY();System.out.println("x:"+x+" y:"+y);}public void mouseReleased(MouseEvent v) {x1=v.getX();y1=v.getY();System.out.println("x1:"+x1+" y1:"+y1);HandleXy(x,y,x1,y1);}//分发坐标给单个监听器public void addListener(Xy xy){listeners.add(xy);}//分发给所有监听器public void HandleXy(int x,int y,int x1,int y1){for(Xy xy:listeners){xy.Coordinate(x, y, x1, y1);}}}

第四步:

 创建一个简单的画图板界面。

public class MyFrame extends JFrame {static Graphics g;static MyFrame frame;public static void main(String[] args) {frame=new MyFrame();frame.initUi();Mylistener ml=new Mylistener();frame.addMouseListener(ml);ml.addListener(new Myline());}private void initUi() {frame.setSize(400, 400);frame.setLocationRelativeTo(null);frame.setVisible(true);g=frame.getGraphics();}}

    程序代码已经写完,我们来运行看看,当我们点击的时候,就能画出一个简化版的英国米字旗了!


    当我们获取到坐标的时候,我还想做一点别的事情,但是又要尽量的少改动已有的代码,怎么做呢?

    新建一个坐标事件监听器的实现类,然后重写其方法,在方法中实现我们想做的事即可,在这里重新又画了一个矩形,代码如下:

public class MyRect implements Xy{Graphics g;public MyRect(){g=MyFrame.g;}public void Coordinate(int x, int y, int x1, int y1) {g.drawRect(x, y, Math.abs(x-x1), Math.abs(y-y1));}}

    然后在我们的界面类中稍作修改,改动后的代码如下:

public class MyFrame extends JFrame {static Graphics g;static MyFrame frame;public static void main(String[] args) {frame=new MyFrame();frame.initUi();Mylistener ml=new Mylistener();frame.addMouseListener(ml);ml.addListener(new MyRect());ml.addListener(new Myline());}private void initUi() {frame.setSize(400, 400);frame.setLocationRelativeTo(null);frame.setVisible(true);g=frame.getGraphics();}}


运行一下,效果如下图:

    

 事件监听模型创建的画图板,虽然不如我们之前做的那样的“省事”,但是也许是我们暂时还不能体会到这种模型的“简单省事”的特点吧,试想,如果我们是做一个微信一般的项目、我们的代码有100个类好几万行,那么这种情况下,你就能体会到“简单省事”了,不信?大家可以去试试!

     事件处理模型对于技术的学习也有很多的启发点,除了本文抛砖引玉的简易画图板,还有许多的技术和产品实现,大家可以自行钻研。

1 0
原创粉丝点击