SWING 事件處理

2018-08-12 21:20 更新

SWING 事件處理

什么是事件?

改變對(duì)象的狀態(tài)被稱為事件,即事件描述源的狀態(tài)變化。事件產(chǎn)生用戶與圖形用戶界面組件交互的結(jié)果。例如,點(diǎn)擊一個(gè)按鈕,移動(dòng)鼠標(biāo),通過鍵盤輸入一個(gè)字符,從列表中選擇一個(gè)項(xiàng)目,滾動(dòng)頁面都是導(dǎo)致一個(gè)事件發(fā)生的活動(dòng)。

事件的類型

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

  • 前臺(tái)事件 - 這些事件需要用戶的直接互動(dòng)。它們是由在圖形用戶界面中人與圖形組件交互的結(jié)果而產(chǎn)生的。例如,點(diǎn)擊一個(gè)按鈕,移動(dòng)鼠標(biāo),通過鍵盤輸入一個(gè)字符,從列表中選擇一個(gè)項(xiàng)目,滾動(dòng)頁面等。

  • 后臺(tái)事件 - 這些事件需要最終用戶的交互,它們被稱為后臺(tái)事件。操作系統(tǒng)的中斷,硬件或軟件故障,計(jì)時(shí)器過期,操作完成都是后臺(tái)事件的例子。

什么是事件處理?

事件處理是一種機(jī)制,如果一個(gè)事件發(fā)生時(shí),它控制該事件,并且決定應(yīng)該會(huì)發(fā)生什么。這種機(jī)制具有被稱為事件處理程序的代碼,當(dāng)一個(gè)事件發(fā)生時(shí),它是可執(zhí)行的。Java 使用代理事件模型來處理事件。該模型定義了標(biāo)準(zhǔn)的機(jī)制來生成和處理事件。讓我們來簡(jiǎn)要介紹這個(gè)模型。

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

  • - 源是一個(gè)對(duì)象,事件發(fā)生在該對(duì)象上。源負(fù)責(zé)提供發(fā)生事件的信息給它的處理器。Java 提供源對(duì)象的類。

  • 監(jiān)聽器 - 它也被稱為作為事件處理。監(jiān)聽器負(fù)責(zé)產(chǎn)生對(duì)一個(gè)事件的響應(yīng)。從 Java 實(shí)現(xiàn)的角度來看,監(jiān)聽器也是一個(gè)對(duì)象。監(jiān)聽器等待直到它接收到一個(gè)事件。一旦收到該事件,監(jiān)聽器進(jìn)程的事件就返回。

這種方法的好處是,用戶界面邏輯完全從生成事件的邏輯中分開。用戶界面元素能夠把事件的處理委派給一段單獨(dú)的代碼。在這個(gè)模型中,監(jiān)聽器需要用源對(duì)象注冊(cè),以便監(jiān)聽器能夠接收事件通知。這是一個(gè)有效的處理事件的方式,因?yàn)檫@些事件通知只發(fā)送給那些想要接收它們的監(jiān)聽器。

事件處理所涉及的步驟

  • 用戶單擊按鈕,然后生成事件。

  • 現(xiàn)在有關(guān)事件類的對(duì)象是自動(dòng)創(chuàng)建的,源和事件的信息在同一對(duì)象得到填充。

  • 事件對(duì)象被轉(zhuǎn)發(fā)到注冊(cè)監(jiān)聽器類的方法中。

  • 該方法現(xiàn)在得到執(zhí)行并且返回。

 有關(guān)監(jiān)聽器要記住的要點(diǎn)

  • 為了設(shè)計(jì)一個(gè)監(jiān)聽器類,我們必須開發(fā)一些監(jiān)聽器接口。這些監(jiān)聽器接口預(yù)測(cè)一些公共的抽象回調(diào)方法,這些方法必須由監(jiān)聽器類來實(shí)現(xiàn)。

  • 如果你沒有實(shí)現(xiàn)任何預(yù)定義的接口,那么你的類不能作為源對(duì)象的監(jiān)聽器類。

回調(diào)方法

這些方法由 API 提供者來提供,由應(yīng)用程序員來定義,并且由應(yīng)用程序開發(fā)者來調(diào)用。這里的回調(diào)方法代表一個(gè)事件方法。響應(yīng)一個(gè)事件 java jre 將觸發(fā)回調(diào)方法。所有這些回調(diào)方法在監(jiān)聽器接口中被提供。

如果一個(gè)組件需要一些監(jiān)聽器監(jiān)聽它的事件,源必須自己注冊(cè)給監(jiān)聽器。

事件處理例子

使用你選擇的任何編輯器創(chuàng)建下面的 Java 程序,在 D:/ > SWING > com > tutorialspoint > gui >

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.");
         }      
      }     
   }
}

使用命令提示符編譯該程序。轉(zhuǎn)到 D:/ > SWING 并輸入下面的命令。

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

如果沒有錯(cuò)誤出現(xiàn),就意味著編譯成功。使用下面的命令來運(yùn)行程序。

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

驗(yàn)證下面的輸出

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)