2012年10月22日 星期一

Java Swing──事件監聽器簡介

本文譯自Introduction to Event Listeners
JAVA官網的入門教學

名詞對照:監聽器=listener、事件=event、最高等級容器=top-level container、容器=container、類別=class、元件=component、文字輸入區域=text area

簡稱說明:GUI=Graphic User Interface=圖形化使用者介面

事件監聽器簡介

如果您曾經閱讀任何"如何使用元件"的頁面,您可能已經知道一些關於事件監聽器的基礎了。

讓我們看看一個最簡單的事件處理範例吧。它是一個叫做呼叫器的按鈕,特色是當您按它時它就會嗶嗶叫。



按那個Launch按鈕來執行呼叫器。它使用了 Java™ Web Start (download JDK 6 or later)技術;相對地,如果您想自行編譯它然後執行,請參考 example index
Launches the Beeper example
A Click Me Beeper Button
您可以在 Beeper.java 找到整個程式。以下是實踐按鈕上的事件處理的程式碼:
public class Beeper ... implements ActionListener {
    ...
    //where initialization occurs:
        button.addActionListener(this);
    ...
    public void actionPerformed(ActionEvent e) {
        ...//Make a beep sound...
    }
}

Beeper 類別實作了 ActionListener 介面,而這個介面擁有一個方法: actionPerformed 。由於 Beeper 實作了 ActionListener,一個 Beeper 物件可以當作一個監聽器來為按鈕註冊action events。一旦 Beeper 被註冊使用 addActionListener 方法, BeeperactionPerformed 方法就會在每次按鈕按下時被呼叫。

一個更複雜的例子

上面那個您看到的,非常簡單的事件模型,是十分有用以及有彈性的。任何數量的事件監聽器物件可以監聽任何數量的事件來源物件,的所有類型的事件。舉例來說,一個程式可能為每個事件來源製造一個監聽器。或者,一個程式可能只有一個監聽器來監聽所有來源的事件。一個程式甚至可以擁有超過一個監聽器來監聽單一一種來自單一來源的事件。
Event source with multiple listeners
數種監聽器可以註冊,以通知從各種來源而來的各種事件。同樣地,一個相同的監聽器可以監聽從不同物件來的通知。

每一個事件都是以一個發出關於事件資訊以及定義事件來源的物件作為代表。事件來源通常是元件或是模型(model),但其他種類的物件也可以成為事件來源。

不管您何時想要從一個特定的元件偵測事件,首先查看一下 關於這個元件的how-to章節。元件的how-to章節的清單在此。how-to章節給出了一些您最可能關心的事件的處理範例。在 How to Use Color Choosers(如何使用顏色挑選器)裡面,舉例來說,您會找到一個追蹤選取顏色的變化的範例。

接下來的範例顯示了事件監聽器可以註冊在數個物件上,以及一樣的事件可以被送至數個監聽器。這個範例包含兩個事件來源 ( JButton ) 和兩個事件監聽器。事件監聽器的其中一個監聽( MultiListener 類別)了來自兩個按鈕的事件。只要它接收到一個事件,它就在上方的文字輸入區中增加"這個事件的命令"(也就是JButton上的文字)。第二個事件監聽器( Eavesdropper 類別)只有監聽其中一個按鈕。當它接受到一個事件,它就增加文字到下方的文字輸入區域。
MultiListener and Eavesdropper responses to buttons

試試這個:
  1. 按下Launch按鈕來執行MultiListener。它使用Java™ Web Start (download JDK 6 or later);相對地,如果您想自行編譯它然後執行,請參考 example index.Launches the MultiListener example
  2. 按下Blah blah blah 按鈕。只有 MultiListener 物件為了這個按鈕註冊了監聽器。
  3. 按下You do not say! 按鈕。MultiListener 物件與 Eavesdropper 物件都註冊了這個按鈕。

您可以在 MultiListener.java 裡找到完整的程式碼。這裡節錄了實踐按鈕事件處理的部分:

public class MultiListener ... implements ActionListener {
    ...
    //where initialization occurs:
        button1.addActionListener(this);
        button2.addActionListener(this);

        button2.addActionListener(new Eavesdropper(bottomTextArea));
    }

    public void actionPerformed(ActionEvent e) {
        topTextArea.append(e.getActionCommand() + newline);
    }
}

class Eavesdropper implements ActionListener {
    ...
    public void actionPerformed(ActionEvent e) {
        myTextArea.append(e.getActionCommand() + newline);
    }
}

在上方的程式碼中, MultiListenerEavesdropper 實作了 ActionListener 介面以及成為 JButton 的 addActionListener 方法的監聽器。兩個類別實作的 actionPerformed 方法很相似:他們簡單地增加了文字到文字輸入區域。

沒有留言:

張貼留言