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事件處理示例


上一篇: Swing控件 下一篇: Swing事件類