JAVA的事件处理机制的核心内容是:事件的发生与事件的处理相分离。也就是说,某一个组件发生了一些变化,则该组件只需要产生一个事件,而不用关心该事件如何被处理。其它组件如果对该事件感兴趣,则编写相应的事件处理代码。
举个例子:点击一个按钮,改变JPanel的背景色。事件的发生代码一定是写在按钮类里面的(由于这个事件已经被AWT定义好了,因此不用我们操心,后面会讲到自定义事件),而事件的处理代码一定是写在JPanel类里面的(我们会在继承于JPanel的一个类中定义一个ActionListener,实现actionPerformed方法),最后把这个ActionListener添加到JButton中,表示 JPanel 对JButton的点击事件感兴趣。
下面来谈一谈自定义事件,这才是本文的重点。首先请想一下,Event到底是什么?我认为,Event就是变化,比如鼠标移动了,窗口最大化了,甚至一个类的属性被改变了……但变化不是Event!那什么样的变化才能算是一个Event呢?其他组件感兴趣的变化才是一个Event。比如上面的点击按钮改变背景色,JButton被点击后,JPanel的颜色发生了变化,即JPanel对JButton的点击很感兴趣,因此,该点击才算是一个事件,才应该用到JAVA的事件处理机制:事件的发生与处理相分离!如果某一个类的变化只有他自己感兴趣,别的类都不感兴趣,那么就没必要使用JAVA的事件处理机制,直接把事件的处理代码写在该类中就可以了(JButton等类是系统定义的,我们很难去修改他的源代码,因此还是用事件处理机制比较好,我这里主要强调自定义的类)。
作为一个自定义的类,如果发生了某些变化,该如何处理这些变化呢?是自己写代码处理,还是利用JAVA的事件处理机制,把处理代码写到别的类里面呢?还是我上面那句话,要看看这个类的变化,其他类是否感兴趣。如果其他类都不感兴趣,那么毫无疑问自己解决就行了;如果只有有限的几个类感兴趣,那么自己解决或者使用JAVA的事件机制都行;如果对此感兴趣的其他类情况未知,数量未知,那么一定要调用JAVA的事件处理机制,自己是搞不定的。举个不太恰当的例子:比如刘德华的手破了流血了(一个只有自己感兴趣的事件),那么自己包扎一下就行了(自己处理);如果刘德华死了(他老婆和他感情很深,决定殉情),那么关于这一事件的处理,也可以由刘德华自己搞定(先杀掉老婆,在自杀);如果刘德华死了,世界上有无数多的fans决定一起殉情,这种情况就不是由刘德华一个人能搞定的了(华仔不能拿着一把菜刀寻遍全世界,把所有愿意殉情的fans都杀死再自杀吧,工程太浩大了~),只能采用JAVA事件处理机制,把刘德华的死讯通知全世界,愿意殉葬的fans自己自杀(如何处理事件完全由自己决定,不由华仔决定)。
那么自定义事件的代码该如何写呢?首先自定义一个MyEvent类,再自定义一个MyListener类,该类中有一个事件处理函数myPerformed。在发生事件的类里面定义一个MyListener[]数组,用于存放监听器。还要定义一个addMyListener()方法,方便别的组件注册监听器。最后在发生事件的地方遍历MyListener数组,调用每一个元素的 myPerformed(MyEvent e)方法即可!
举个例子:点击一个按钮,改变JPanel的背景色。事件的发生代码一定是写在按钮类里面的(由于这个事件已经被AWT定义好了,因此不用我们操心,后面会讲到自定义事件),而事件的处理代码一定是写在JPanel类里面的(我们会在继承于JPanel的一个类中定义一个ActionListener,实现actionPerformed方法),最后把这个ActionListener添加到JButton中,表示 JPanel 对JButton的点击事件感兴趣。
下面来谈一谈自定义事件,这才是本文的重点。首先请想一下,Event到底是什么?我认为,Event就是变化,比如鼠标移动了,窗口最大化了,甚至一个类的属性被改变了……但变化不是Event!那什么样的变化才能算是一个Event呢?其他组件感兴趣的变化才是一个Event。比如上面的点击按钮改变背景色,JButton被点击后,JPanel的颜色发生了变化,即JPanel对JButton的点击很感兴趣,因此,该点击才算是一个事件,才应该用到JAVA的事件处理机制:事件的发生与处理相分离!如果某一个类的变化只有他自己感兴趣,别的类都不感兴趣,那么就没必要使用JAVA的事件处理机制,直接把事件的处理代码写在该类中就可以了(JButton等类是系统定义的,我们很难去修改他的源代码,因此还是用事件处理机制比较好,我这里主要强调自定义的类)。
作为一个自定义的类,如果发生了某些变化,该如何处理这些变化呢?是自己写代码处理,还是利用JAVA的事件处理机制,把处理代码写到别的类里面呢?还是我上面那句话,要看看这个类的变化,其他类是否感兴趣。如果其他类都不感兴趣,那么毫无疑问自己解决就行了;如果只有有限的几个类感兴趣,那么自己解决或者使用JAVA的事件机制都行;如果对此感兴趣的其他类情况未知,数量未知,那么一定要调用JAVA的事件处理机制,自己是搞不定的。举个不太恰当的例子:比如刘德华的手破了流血了(一个只有自己感兴趣的事件),那么自己包扎一下就行了(自己处理);如果刘德华死了(他老婆和他感情很深,决定殉情),那么关于这一事件的处理,也可以由刘德华自己搞定(先杀掉老婆,在自杀);如果刘德华死了,世界上有无数多的fans决定一起殉情,这种情况就不是由刘德华一个人能搞定的了(华仔不能拿着一把菜刀寻遍全世界,把所有愿意殉情的fans都杀死再自杀吧,工程太浩大了~),只能采用JAVA事件处理机制,把刘德华的死讯通知全世界,愿意殉葬的fans自己自杀(如何处理事件完全由自己决定,不由华仔决定)。
那么自定义事件的代码该如何写呢?首先自定义一个MyEvent类,再自定义一个MyListener类,该类中有一个事件处理函数myPerformed。在发生事件的类里面定义一个MyListener[]数组,用于存放监听器。还要定义一个addMyListener()方法,方便别的组件注册监听器。最后在发生事件的地方遍历MyListener数组,调用每一个元素的 myPerformed(MyEvent e)方法即可!