AWT事件處理


事件是什麼?

一個物件的狀態變化被稱為事件,即事件描述源狀態的變化。事件產生的結果與使用者互動的圖形化使用者介面元件。例如,點選一個按鈕,移動滑鼠,通過鍵盤輸入一個字元,從列表中選擇一個專案,捲動頁面的活動,使一個事件的發生。

事件的型別

事件可以被大致分為兩類:

  • 前台事件 - 這些事件需要使用者直接互動。在圖形化使用者介面中的圖形元件互動的人產生的後果。例如,點選一個按鈕,移動滑鼠,通過鍵盤輸入一個字元,從列表中選擇一個專案,捲動頁面等

  • 後台事件 - 這些事件,需要終端使用者的互動是已知的作為後台的事件。作業系統的中斷,硬體或軟體故障,定時器到期時,操作完成的後台事件的例子。

事件處理是什麼?

事件處理機制,控制的事件,並決定如果一個事件發生時,會發生什麼。這種機制被稱為事件處理程式,在事件發生時執行的程式碼。 Java使用代理事件模型來處理事件。該模型定義了標準的機制來生成和處理事件。讓我們簡要介紹這種模式。

代理事件模型具有以下的主要參與者,即:

  • 源 - 源是一個物件,在該物件上的事件發生。它的處理器提供發生事件的資訊來源是可靠的。 JAVA提供源物件的類。

  • 監聽器 - 它也被稱為事件處理程式。監聽器是負責生成響應事件。從Java實現的角度來看,監聽器也是一個物件。等待,直到它接收到一個事件監聽器。一旦收到事件,監聽器進程的事件然後返回。

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

參與事件處理的步驟

  • 使用者單擊該按鈕時產生該事件。

  • 現在有關事件類的物件是自動建立的資訊源和事件在同一物件得到填充。

  • 事件物件被轉發註冊監聽器類的方法。

  • 該方法現在得到執行和返回。

要記住的有關監聽器要點

  • 為了設計一個監聽類,我們必須制定一些監聽器介面。這些監聽器介面預測一些公共的抽象監聽器類必須實現的回撥方法。

  • 如果不實現任何預定義的介面,你的類不能作為源物件的監聽器類。

回撥方法

這些方法所提供的API提供者,被定義為應用程式員和應用程式開發者呼叫。這裡的回撥方法代表一個事件的方法。在響應一個事件的Java JRE將觸發回撥方法。所有這些回撥方法的監聽器介面。

如果一個元件需要一些監聽器將監聽的事件源必須註冊自己的監聽器。

事件處理範例

選擇使用任何編輯器建立以下java程式 D:/ > AWT > com > yiibai > gui >

AwtControlDemo
package com.yiibai.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 comyiibaiguiAwtControlDemo.java

如果沒有錯誤出現,這意味著編譯成功。使用下面的命令來執行程式。

D:AWT>java com.yiibai.gui.AwtControlDemo

驗證下面的輸出

AWT Event Handling