- Swing 教程
- Swing - 首頁
- Swing - 概述
- Swing - 環境
- Swing - 控制元件
- Swing - 事件處理
- Swing - 事件類
- Swing - 事件監聽器
- Swing - 事件介面卡
- Swing - 佈局
- Swing - 選單
- Swing - 容器
- Swing 有用資源
- Swing - 快速指南
- Swing - 有用資源
- Swing - 討論
Swing - 事件處理
在本章中,您將學習關於事件、事件型別,以及如何處理事件。本章末尾提供了示例以幫助您更好地理解。
什麼是事件?
物件狀態的變化稱為事件,即事件描述了源物件狀態的變化。事件是由使用者與圖形使用者介面元件互動產生的。例如,點選按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案以及滾動頁面等活動都會導致事件的發生。
事件型別
事件可以大致分為兩類:
前臺事件 - 這些事件需要使用者的直接互動。它們是由使用者與圖形使用者介面中的圖形元件互動產生的結果。例如,點選按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案、滾動頁面等。
後臺事件 - 這些事件需要終端使用者的互動。作業系統中斷、硬體或軟體故障、計時器到期和操作完成是一些後臺事件的示例。
什麼是事件處理?
事件處理是一種控制事件並決定事件發生時應採取何種操作的機制。此機制包含一段程式碼,稱為事件處理程式,當事件發生時執行該程式碼。
Java 使用委託事件模型來處理事件。此模型定義了生成和處理事件的標準機制。
委託事件模型具有以下關鍵參與者。
源 - 源是在其上發生事件的物件。源負責將其處理程式的資訊提供給已發生的事件。Java 為源物件提供了類。
監聽器 - 也稱為事件處理程式。監聽器負責對事件做出響應。從 Java 實現的角度來看,監聽器也是一個物件。監聽器等待直到收到事件。一旦收到事件,監聽器就會處理事件並返回。
這種方法的好處是使用者介面邏輯與生成事件的邏輯完全分離。使用者介面元素能夠將事件的處理委託給單獨的程式碼段。
在此模型中,需要將監聽器註冊到源物件,以便監聽器可以接收事件通知。這是一種有效的事件處理方式,因為事件通知僅傳送給想要接收它們的監聽器。
事件處理涉及的步驟
步驟 1 - 使用者單擊按鈕並生成事件。
步驟 2 - 自動建立相關事件類的物件,並在同一物件中填充有關源和事件的資訊。
步驟 3 - 事件物件轉發到已註冊的監聽器類的 method 中。
步驟 4 - method 被執行並返回。
關於監聽器的要點
為了設計一個監聽器類,您必須開發一些監聽器介面。這些 Listener 介面預測了一些公共抽象回撥 method,這些 method 必須由監聽器類實現。
如果您沒有實現任何預定義的介面,那麼您的類不能充當源物件的監聽器類。
回撥方法
這些是 API 提供者提供的 method,由應用程式程式設計師定義並由應用程式開發人員呼叫。這裡的回撥 method 表示事件 method。響應事件,Java JRE 將觸發回撥 method。所有這些回撥 method 都在監聽器介面中提供。
如果某個元件希望某個監聽器監聽其事件,則源必須將其自身註冊到監聽器。
事件處理示例
使用您選擇的任何編輯器在例如D:/ > SWING > com > tutorialspoint > gui >中建立以下 Java 程式。
SwingControlDemo.java
package com.tutorialspoint.gui;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class SwingControlDemo {
private JFrame mainFrame;
private JLabel headerLabel;
private JLabel statusLabel;
private JPanel controlPanel;
public SwingControlDemo(){
prepareGUI();
}
public static void main(String[] args){
SwingControlDemo swingControlDemo = new SwingControlDemo();
swingControlDemo.showEventDemo();
}
private void prepareGUI(){
mainFrame = new JFrame("Java SWING Examples");
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("OK");
JButton submitButton = new JButton("Submit");
JButton cancelButton = new JButton("Cancel");
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("Ok Button clicked.");
} else if( command.equals( "Submit" ) ) {
statusLabel.setText("Submit Button clicked.");
} else {
statusLabel.setText("Cancel Button clicked.");
}
}
}
}
使用命令提示符編譯程式。轉到D:/ > SWING並鍵入以下命令。
D:\AWT>javac com\tutorialspoint\gui\SwingControlDemo.java
如果未發生錯誤,則表示編譯成功。使用以下命令執行程式。
D:\AWT>java com.tutorialspoint.gui.SwingControlDemo
驗證以下輸出。