1. 程式人生 > >JAVA事件處理的三種不同方法

JAVA事件處理的三種不同方法

    在Java的圖形介面開發中,要讓圖形介面接收到使用者的操作,就要給各個元件新增事件處理機制。在事件處理過程中,涉及到3類物件。第一是Event事件,實現使用者對圖形介面元件的操作,以類的形式出現,比如視窗操作對應類為WindowEvent,鍵盤操作對應類為KeyEvent;第二是事件源,即事件發生的場所,比如一個按鈕、單選框或複選框、文字框等;第三就是事件處理者,接收發生的事件並進行處理,也稱監聽器。

         事件處理有3種不同的方法,下面進行詳細的介紹。

        1、事件介面卡

         Java為一些Listener介面提供了介面卡類,這樣,可以通過繼承介面卡類實現有關方法,而無關方法不用實現,大大減少了程式碼量。如:

        

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

public class Example1  extends WindowAdapter implements ActionListener
{
    private Frame win;
    private TextField tf;
    private TextArea ta;
    private Button bun;
   Example1()
   {
       win = new Frame("事件介面卡");
       tf = new TextField(20);
       ta = new TextArea(10, 20);
       ta.setEditable(false);
       bun = new Button("新增");
       bun.addActionListener(this);
       win.setLayout(new FlowLayout());
       win.add(tf);
       win.add(bun);
       win.add(ta);
       win.addWindowListener(this);    

       win.setSize(300, 300);
       win.setVisible(true);
  
   }
 
   public void actionPerformed(ActionEvent e)
  {
      String s = tf.getText();
      if(s != "")
      {
         ta.append(s+"\n");
      }
  }
  
  public void windowClosing(WindowEvent e)
  {
     System.exit(0);
  }
 
  public static void main(String args[])
  {
     Example1 w = new Example1();
  }
}

   在上面的程式中,Example1類繼承了WindowAdapter介面卡類和ActionListener介面,生成的框架中有3個元件:文字框、按鈕和文字域,當用戶按了按鈕後,發生ActionEvent事件,使用者在文字框中輸入的字串將新增到文字域中,實現程式在函式actionPerformed中。win.addWindowListener(this);    將Example1類設為監聽器,當用戶按了框架退出按鈕時,觸發WindowEvent事件,而Example1類繼承了windowClosing介面,退出程式,其它無關介面如windowOpened(開啟時)、windowIconified(圖示化)則不用實現。

    2、內部類實現事件處理

    

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

public class Example2 implements ActionListener
{
     private Frame win;
     private TextField tf;
     private TextArea ta;
     private Button bun;
    Example2()
    {
       win = new Frame("內部類");
       tf = new TextField(20);
      ta = new TextArea(10, 20);
      ta.setEditable(false);
      bun = new Button("新增");
      bun.addActionListener(this);
      win.setLayout(new FlowLayout());
      win.add(tf);
      win.add(bun);
      win.add(ta);
      win.addWindowListener(new MyWinClose());

      win.setSize(300, 300);
      win.setVisible(true);
  
    }
 
     public void actionPerformed(ActionEvent e)
    {
        String s = tf.getText();
        if(s != "")
       {
         ta.append(s+"\n");
       }
    }
 
  class MyWinClose extends WindowAdapter
  {
     public void windowClosing(WindowEvent e)
    {
         System.exit(0);
     }
  }
 
   public static void main(String args[])
  {
      Example2 w = new Example2();
  
  }
 
}

    win.addWindowListener(new MyWinClose());即把MyWinClose設為監聽器,該類繼承了WindowAdapter介面卡,實現了windowClosing介面。

  使用內部類的原因如下:

   (1)一個內部類的物件可訪問外部類的成員方法和變數,包括私有的成員;

   (2)非常容易實現;

   (3)內部類編寫時間驅動程式很方便。

 

    3、匿名類

      

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

public class Example3 implements ActionListener
{
   private Frame win;
   private TextField tf;
   private TextArea ta;
   private Button bun;
   Example3()
   {
      win = new Frame("匿名類");
     tf = new TextField(20);
     ta = new TextArea(10, 20);
     ta.setEditable(false);
    bun = new Button("新增");
    bun.addActionListener(this);
    win.setLayout(new FlowLayout());
    win.add(tf);
    win.add(bun);
    win.add(ta);
    win.addWindowListener(new WindowAdapter()
   {
     public void windowClosing(WindowEvent e)
    {
      System.exit(0);
    }
   });

   win.setSize(300, 300);
   win.setVisible(true);
  
  }
 
  public void actionPerformed(ActionEvent e)
  {
     String s = tf.getText();
     if(s != "")
    {
       ta.append(s+"\n");
    }
   }
 
 
   public static void main(String args[])
  {
     Example3 w = new Example3();
  
  }
 
}

   使用匿名類更加方便,匿名就是連名字也沒有,只是顯式地呼叫一個無參的父類的構造方法。