基於Java GUI 事件處理方式

事件處理主要涉及:事件源,事件,事件處理者

在GUI中事件源是事件發生的場所,通常是各個組件,如被單擊的按鈕;事件是用戶對界面的操作,如操作鍵盤是觸發的鍵盤事件;而事件處理者則是對收到的事件經行處理的程序,也稱監聽器。

java.awt.event包中實現對事件處理的相關類和接口

  • 以Event結尾的類:事件類,如ActionEvent , WindowEvent , MouseEvent , KeyEvent
  • 以Listener結尾的接口:是一些與特定事件相關的的監聽器接口,每個接口都定義瞭需要特定監聽器實現的方法,是事件處理者的具體實現,如ActionListener , WindowListener ,MouseListerer , KeyListener
  • 以Adapter結尾的類(即適配器類):是一些已經實現瞭所有方法的特殊接口,是為瞭簡化代碼引入的一種監聽器手段,隻需要重寫需要的方法即可。但是由於Java的單繼承特性,如果要使用多種監聽器或此類已經有瞭父類則無法繼承適配器類瞭,如 WindowAdapter , MouseAdapter , KeyListener , 無 ActionEvent

註意:

事件處理者,即監聽器為瞭能夠處理某種類型的事件,必須實現與該事件類型相對的接口,即成為一個實現某接口的類對象。

事件是通過事件處理者包含的方法傳入的,而該方法就是實現接口時必須實現的方法。

如ActionListener接口中的 void actionPerformed( ActionEvent e )方法。

如:單擊按鈕對 應於動作事件即(ActionEvent),按鈕事件處理者是實現例動作事件對應的Listener接口的 類對象,需要調用按鈕的addActionListener()方法註冊,該類是重寫ActionListener 接口中的void actionPerformed( ActionEvent e )方法

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; 
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("理解事件處理");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(null);
 
        //創建按鈕對象
        JButton button = new JButton("請單擊本次按鈕");
        button.setBounds(120,60,120,30);
        frame.add(button);
        //創建按鈕監聽器並註冊,參數為事件處理者對象
        ButtonHandler buttonHandler = new ButtonHandler();
        button.addActionListener(buttonHandler);//與單擊事件相關的授權處理的方法
 
        frame.setBounds(400,200,400,200);
        frame.setVisible(true);
    }
}
 
class ButtonHandler implements ActionListener{
    public void actionPerformed(ActionEvent e) {
        System.out.println("單擊一次按鈕");
    }
}

效果圖:

從上例中可以看出編寫事件處理可大致分為三步:

  • 第一步:創建某組件對象,並考慮該組件對象與哪個或哪些事件相關。如創建按鈕對象,相關的事件是動作事件,即ActionEvent。
  • 第二步:編寫該組件對象的事件處理者類,即實現要處理事件對應的監聽器接口,如編寫事件處理者ButtonHandler類,實現ActionEvent對應的ActionListener接口,具體來說就是實現接口中的void actionPerformed( ActionEvent e )方法,在該方法中加入處理事件的代碼。
  • 第三步:創建事件處理者類的實例,並調用組件對象的對應該類事件的添加方法來註冊監聽器,如調用按鈕的addActionListener( ActionListener 1) 方法添加 ButtonHandler類實例。

例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
 
public class Test{
    public static void main(String[] args) {
        JFrame frame = new JFrame("深入掌握事件處理");
        frame.setDefaultCloseOperation(3);
        frame.setLayout(null);
        //創建提示 信息
        JLabel label1 = new JLabel("請在窗體內移動鼠標");
        label1.setBounds(15,5,200,25);
        frame.add(label1);
        JLabel label2 = new JLabel("或按住鼠標左鍵拖動鼠標");
        label2.setBounds(15,30,200,25);
        frame.add(label2);
        //創建文本框對象,檢測
        JTextField text = new JTextField(30);
        text.setBounds(15,55,200,30);
        frame.add(text);
        //註冊監聽器,參數為事件處理者對象
        MouseListenerImp mouse = new MouseListenerImp(text);//事件處理者類  實例化
        frame.addMouseListener(mouse);
        frame.addMouseMotionListener(mouse);
        frame.addWindowListener(mouse); 
        frame.setBounds(500,250,300,150);
        frame.setVisible(true);
    }
}
 
//編寫事件處理對象類  實現鼠標窗體的相關接口
class MouseListenerImp implements MouseListener, MouseMotionListener, WindowListener{
    JTextField text; 
    public MouseListenerImp(JTextField text){
        this.text = text;
    }
    public void mouseDragged(MouseEvent e){ //提供拖拽時的鼠標坐標
        String s = "托拽鼠標,坐標: x =" + e.getX() + "y = " + e.getY();
        text.setText(s);//在文本框中可輸出
    }
    public void mouseEntered(MouseEvent e) {  //檢查鼠標是否在窗體內
        String s = "鼠標離開瞭窗體";
        text.setText(s);//在文本框中可輸出
    }
    public void mouseExited(MouseEvent e) {   //檢查鼠標是否在窗體內
        String s = "鼠標進入瞭窗體";
        text.setText(s);//在文本框中可輸出
    }
    public void windowClosing(WindowEvent e) {//為瞭式窗口能正常關閉
        System.exit(1);
    }
    //不打算實現的方法,但是因為實現接口,所以要寫出來
    public void mouseMoved(MouseEvent e){}
    public void mouseClicked(MouseEvent e){}
    public void mousePressed(MouseEvent e){}
    public void mouseReleased(MouseEvent e){}
    public void windowOpened(WindowEvent e){}
    public void windowClosed(WindowEvent e){}
    public void windowIconified(WindowEvent e){}
    public void windowDeiconified(WindowEvent e){}
    public void windowActivated(WindowEvent e){}
    public void windowDeactivated(WindowEvent e){}
}

效果圖:

上述代碼的class MouseListenerImp implements MouseListener, MouseMotionListener, WindowListener 同時實現瞭三個接口,要實現接口需要寫全部重寫接口中的方法,但如果將其中某個接口用Adapter類 代替則可有】優化代碼 即 extends MouseAdapter

事件的種類:

  • 組件事件ComponentEvent:組件尺寸的變化和移動
  • 容器事件ContainerEvent:組件增加或移動
  • 窗口事件WindowEvent:關閉窗口,激活窗口閉合,最大化,最小化
  • 焦點事件FocusEvent:焦點的獲得與失去
  • 鍵盤事件KeyEvent:鍵的按下或釋放
  • 鼠標事件MouseEvent:鼠標單擊與移動
  • 動作事件ActionEvent:單擊按鈕,在文本框中按Enter鍵
  • 項目事件ItemEvent:從選擇框或列表框中選擇一項
  • 調節事件AdjustEvent:移滾動條上的滑塊以調節數值
  • 文本事件TextEvent:文本對象的改變

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: