Swing事件處理


在本章中,您將了解事件及其型別,並了解如何處理事件。為了更好地理解,在小節的末尾提供了一個演示範例。

事件是什麼?

物件狀態的更改稱為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("點選了'取消'按鈕");
            }
        }
    }
}

執行上面範例程式碼,得到以下結果:

Swing事件處理示例