在本章中,您將瞭解事件及其類型,並瞭解如何處理事件。為了更好地理解,在小節的末尾提供了一個演示示例。
事件是什麼?
對象狀態的更改稱為Event,即事件描述源的狀態更改。由於用戶與圖形用戶介面組件的交互而生成事件。例如,單擊按鈕,移動滑鼠,通過鍵盤輸入字元,從列表中選擇專案以及滾動頁面都是導致事件發生的活動。
事件類型
這些事件大致可分為兩類 -
前臺事件 - 這些事件需要用戶的直接交互。它們是作為人與圖形用戶介面中的圖形組件交互的結果而生成的。例如,單擊按鈕,移動滑鼠,通過鍵盤輸入字元,從列表中選擇專案,滾動頁面等。
後臺事件 - 這些事件需要最終用戶的交互。後臺事件的示例有:操作系統中斷,硬體或軟體故障,計時器到期和操作完成。
什麼是事件處理?
事件處理是控制事件並決定事件發生時應該發生什麼的機制。此機制具有處理的代碼,稱為事件處理程式,它在事件發生時執行。
Java使用委派事件模型來處理事件。該模型定義了生成和處理事件的標準機制。
授權事件模型具有以下主要參與者。
源 - 源是事件發生的對象。源負責向其處理程式提供已發生事件的資訊。Java為我們提供了源對象的類。
監聽器 - 它也稱為事件處理程式。監聽器負責生成對事件的回應。從Java實現的角度來看,監聽器也是一個對象。監聽等待直到收到事件。收到事件後,監聽器處理事件然後返回。
這種方法的好處是用戶介面邏輯與生成事件的邏輯完全分離。用戶介面元素能夠將事件的處理委託給單獨的代碼。
在此模型中,需要向源對象註冊監聽器,以便監聽器可以接收事件通知。這是處理事件的有效方式,因為事件通知僅發送給想要接收它們的監聽器。
事件處理的步驟
第1步 - 用戶單擊按鈕並生成事件。
第2步 - 自動創建相關事件類的對象,並在同一對象中填充有關源和事件的資訊。
第3步 - 將事件對象轉發到已註冊的監聽器類方法。
第4步 - 監聽器類方法執行並返回。
關於監聽器的要點
為了設計一個監聽器類,必須開發一些監聽器介面。這些監聽器介面預測了一些公共抽象回調方法,這些方法必須由監聽器類實現。
如果未實現任何預定義介面,則類不能充當源對象的偵聽器類。
回調方法
這些是API提供程式提供的方法,由應用程式程式員定義並由應用程式開發人員調用。這裏的回調方法代表一個事件方法。在回應事件時,java jre將觸發回調方法。所有這些回調方法都在監聽器介面中提供。
如果組件想要某個偵聽器監聽其事件,則源必須註冊到偵聽器。
事件處理示例
使用編輯器創建以下Java程式:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class EventHandlingExample {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
public EventHandlingExample() {
prepareGUI();
}
public static void main(String[] args) {
EventHandlingExample swingControlDemo = new EventHandlingExample();
swingControlDemo.showEventDemo();
}
private void prepareGUI() {
mainFrame = new JFrame("Java SWING監聽處理示例");
mainFrame.setSize(400, 400);
mainFrame.setLayout(new GridLayout(3, 1));
headerLabel = new JLabel("", JLabel.CENTER);
statusLabel = new JLabel("", JLabel.CENTER);
statusLabel.setSize(350, 100);
mainFrame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent windowEvent) {
System.exit(0);
}
});
controlPanel = new JPanel();
controlPanel.setLayout(new FlowLayout());
mainFrame.add(headerLabel);
mainFrame.add(controlPanel);
mainFrame.add(statusLabel);
mainFrame.setVisible(true);
}
private void showEventDemo() {
headerLabel.setText("Control in action: Button");
JButton okButton = new JButton("確定");
JButton submitButton = new JButton("提交");
JButton cancelButton = new JButton("取消");
okButton.setActionCommand("OK");
submitButton.setActionCommand("Submit");
cancelButton.setActionCommand("Cancel");
okButton.addActionListener(new ButtonClickListener());
submitButton.addActionListener(new ButtonClickListener());
cancelButton.addActionListener(new ButtonClickListener());
controlPanel.add(okButton);
controlPanel.add(submitButton);
controlPanel.add(cancelButton);
mainFrame.setVisible(true);
}
private class ButtonClickListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand();
if (command.equals("OK")) {
statusLabel.setText("點擊了'確定'按鈕");
} else if (command.equals("Submit")) {
statusLabel.setText("點擊了'提交'按鈕");
} else {
statusLabel.setText("點擊了'取消'按鈕");
}
}
}
}
執行上面示例代碼,得到以下結果: