AWT 事件處理



什麼是事件?

物件狀態的改變稱為事件,即事件描述了源狀態的改變。事件是使用者與圖形使用者介面元件互動的結果而生成的。例如,點選按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案、滾動頁面等活動都會導致事件發生。

事件型別

事件可以大致分為兩類

  • 前臺事件 - 這些事件需要使用者的直接互動。它們是由於使用者與圖形使用者介面中的圖形元件互動而產生的。例如,點選按鈕、移動滑鼠、透過鍵盤輸入字元、從列表中選擇專案、滾動頁面等。

  • 後臺事件 - 這些事件不需要終端使用者的互動被稱為後臺事件。作業系統中斷、硬體或軟體故障、計時器到期、操作完成都是後臺事件的示例。

什麼是事件處理?

事件處理是控制事件並決定事件發生時應該發生什麼的機制。此機制包含稱為事件處理程式的程式碼,當事件發生時執行該程式碼。Java 使用委託事件模型來處理事件。此模型定義了生成和處理事件的標準機制。讓我們簡要介紹一下此模型。

委託事件模型具有以下關鍵參與者

  • - 源是發生事件的物件。源負責向其處理程式提供已發生事件的資訊。Java 為源物件提供了類。

  • 監聽器 - 也稱為事件處理程式。監聽器負責對事件做出響應。從 Java 實現的角度來看,監聽器也是一個物件。監聽器等待直到收到事件。一旦收到事件,監聽器就會處理事件,然後返回。

這種方法的好處是使用者介面邏輯與生成事件的邏輯完全分離。使用者介面元素能夠將事件的處理委託給單獨的程式碼段。在此模型中,需要將監聽器註冊到源物件,以便監聽器可以接收事件通知。這是一種有效的事件處理方式,因為事件通知僅傳送給那些想要接收它們的監聽器。

事件處理涉及的步驟

  • 使用者點選按鈕並生成事件。

  • 現在會自動建立相關事件類的物件,並且有關源和事件的資訊會填充到同一物件中。

  • 事件物件被轉發到已註冊監聽器類的函式。

  • 函式現在被執行並返回。

關於監聽器的要點

  • 為了設計一個監聽器類,我們必須開發一些監聽器介面。這些監聽器介面預測了一些公共抽象回撥函式,這些函式必須由監聽器類實現。

  • 如果您沒有實現任何預定義的介面,那麼您的類不能充當源物件的監聽器類。

回撥函式

這些是 API 提供者提供的函式,由應用程式程式設計師定義並由應用程式開發人員呼叫。此處,回撥函式表示事件函式。響應事件,Java JRE 將觸發回撥函式。所有此類回撥函式都在監聽器介面中提供。

如果某個元件希望某個監聽器偵聽其事件,則源必須將其自身註冊到該監聽器。

事件處理示例

使用您選擇的任何編輯器在例如D:/ > AWT > com > tutorialspoint > gui >中建立以下 Java 程式。

AwtControlDemo.java
package com.tutorialspoint.gui;

import java.awt.*;
import java.awt.event.*;

public class AwtControlDemo {

   private Frame mainFrame;
   private Label headerLabel;
   private Label statusLabel;
   private Panel controlPanel;

   public AwtControlDemo(){
      prepareGUI();
   }

   public static void main(String[] args){
      AwtControlDemo  awtControlDemo = new AwtControlDemo();
      awtControlDemo.showEventDemo();
   }

   private void prepareGUI(){
      mainFrame = new Frame("Java AWT Examples");
      mainFrame.setSize(400,400);
      mainFrame.setLayout(new GridLayout(3, 1));
      mainFrame.addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent windowEvent){
            System.exit(0);
         }        
      });    
      headerLabel = new Label();
      headerLabel.setAlignment(Label.CENTER);
      statusLabel = new Label();        
      statusLabel.setAlignment(Label.CENTER);
      statusLabel.setSize(350,100);

      controlPanel = new Panel();
      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"); 

      Button okButton = new Button("OK");
      Button submitButton = new Button("Submit");
      Button cancelButton = new Button("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:/ > AWT並鍵入以下命令。

D:\AWT>javac com\tutorialspoint\gui\AwtControlDemo.java

如果沒有錯誤,則表示編譯成功。使用以下命令執行程式。

D:\AWT>java com.tutorialspoint.gui.AwtControlDemo

驗證以下輸出

AWT Event Handling
廣告

© . All rights reserved.