在JAVA程序設(shè)計(jì)中,事件的處理是非常重要的,尤其是在需要自定義事件和設(shè)計(jì)JavaBean時(shí).對事件的處理過程有一個完整的認(rèn)識對于編程是很有幫助的。
一、事件:用戶對程序的某一種功能性操作
Java中的事件主要有兩種:
1.組件類事件
componentEvent、ContainerEvent、WindowEvent、FocusEvent、PaintEvent、MouseEvent共六大類,
它們均是當(dāng)組件的狀態(tài)發(fā)生變化時(shí)產(chǎn)生。
2.動作類事件
ActionEvent、TextEvent、AdjustmentEvent、ItemEvent共四類。
Java中的事件類都包含在JDK的Java.awt.event包中。
二、事件編程:
用戶編程定義每個特定事件發(fā)生時(shí)程序應(yīng)做出何種響應(yīng),并且這些響應(yīng)代碼會在對應(yīng)的事件發(fā)生時(shí)由系統(tǒng)自動調(diào)用。
如果想要自定義一個事件,則必須提供一個事件的監(jiān)聽接口以及一個事件類。在JAVA中監(jiān)聽接口繼承java.util.EventListener,事件類繼承java.util.EventObject.很多基本的事件在編程環(huán)境中都已經(jīng)提供可以很方便使用,但是在自定義事件中必須要要了解這些。
當(dāng)你把界面都設(shè)計(jì)好了,總需要添加相應(yīng)的執(zhí)行動作給組件,在JAVA中有相應(yīng)的時(shí)間處理機(jī)制,叫做“監(jiān)聽器”,給組件添加相應(yīng)執(zhí)行動作的過程叫做“注冊”,其中的“監(jiān)聽器”是一個接口,里面包含了相應(yīng)的執(zhí)行函數(shù),要做的是自己實(shí)現(xiàn)其中的方法函數(shù),然后“注冊”給組件,通俗一點(diǎn)的話就是老媽讓我去買醬油,老媽不關(guān)心我會轉(zhuǎn)過幾天街道,會怎樣和老板到討價(jià)還價(jià)怎樣回家,老媽需要的最終結(jié)果是我能夠?qū)⑨u油交付到她的手中,期中買醬油的過程是我實(shí)現(xiàn)的,我就是事件處理機(jī)制里面的“監(jiān)聽器”接受老媽的指示,老媽讓我買醬油去,就是對應(yīng)將事件“注冊”給我,呵呵,又一次完美體現(xiàn)了JAVA中實(shí)現(xiàn)與接口分離。
JAVA中的組件事件有ActionEvent、KeyEvent、FocusEvent、ComponentEvent、MouseEvent、AdjustmentEvent等,每個組件支持其中的全部或者是一部分事件,相應(yīng)的事件有相應(yīng)的Listener來監(jiān)聽事件的發(fā)生并且實(shí)現(xiàn)接口的方法,程序員要做的事情就是創(chuàng)建一個事件的類對象,實(shí)現(xiàn)它里面的函數(shù),然后將它注冊給相應(yīng)的組件,下面用代碼演示一下:
1 import javax.swing.*;
2 import java.awt.*;
3 import java.awt.event.*;
4
5 public class ButtonDemo {
6 private JFrame
7 frame=new JFrame("ButtonDemo");
8 private JButton
9 b1 = new JButton("按鈕1"),
10 b2 = new JButton("按鈕2");
11 private JTextField
12 txt = new JTextField(10);
13 //這里是使用一個匿名類來實(shí)現(xiàn)對按鈕的監(jiān)聽
14 private ActionListener bl = new ActionListener() {
15 //實(shí)現(xiàn)監(jiān)聽類中的抽象函數(shù)
16 public void actionPerformed(ActionEvent e) {
17 String name = ((JButton)e.getSource()).getText();
18 txt.setText(name);
19 }
20 };
21 public ButtonDemo () {
22 //將監(jiān)聽對象注冊給兩個按鈕
23 b1.addActionListener(bl);
24 b2.addActionListener(bl);
25 frame.setLayout(new FlowLayout());
26 frame.add(b1);
27 frame.add(b2);
28 frame.add(txt);
29 frame.setVisible(true);
30 frame.setSize(200,150);
31
32 }
33 public static void main(String[] args) {
34 new ButtonDemo ();
35 }
36 }
監(jiān)聽接口中如果有不止一個函數(shù),而我只想實(shí)現(xiàn)其中的一個函數(shù)的時(shí)候,很顯示程序是不能運(yùn)行的,因?yàn)槟惚仨殞?shí)現(xiàn)接口當(dāng)中的所有函數(shù)的時(shí)候,才可以通過編譯,程序才可以跑起來,那應(yīng)該怎們辦納?呵呵,顯然JAVA語言設(shè)計(jì)者已經(jīng)考慮到了這一點(diǎn),所以提供了一個叫做“適配器”的家伙,它默認(rèn)實(shí)現(xiàn)了接口當(dāng)中的所有函數(shù),繼承“適配器”這個類,并覆蓋你所該興趣的那個函數(shù)就可以了:
1 class MyMouseListener extends MouseAdapter{
2 public void mouseClicked(MouseEvent e){
3 //實(shí)現(xiàn)當(dāng)點(diǎn)擊鼠標(biāo)時(shí)的動作
4 }
5 }