1. 程式人生 > >監聽器、事件、事件源、事件註冊深度剖析

監聽器、事件、事件源、事件註冊深度剖析

left local ets clas imp for 圖形 沒有 執行

  • AWT事件處理

事件處理機制,幾類具有典型代表意義的事件:

技術分享圖片

幾種常用事件處理機制

查看JDK Doc文檔中的

  • 用戶圖形界面的行為

1、事件類型

(1)事件類的層次結構圖如下所示。許多事件類在java.awt.event包中,也有一些事件類在API的其他地方。

(2)對於每類事件,都有一個接口,這個接口必須由想接收這個事件的類的對象實現。這個接口還要求定義一個或多個方法。當發生特定的事件時,就會調用這些方法。

2、事件類的結構圖:不需要記,用的時候學會查看JDK文檔即可。

技術分享圖片

3、方法類型和接口

技術分享圖片

技術分享圖片

demo程序如下:


package com.ahueir.awt;  

import java.awt.Button;   
import java.awt.Frame;   
import java.awt.event.ActionEvent;   
import java.awt.event.ActionListener;   
import java.awt.event.WindowEvent;   
import java.awt.event.WindowListener;  
import java.util.Date;  

public class MyFrame2 {

    public static void main(String[] args) {

        Frame frame =  new Frame("My Frame2");

        /*
         * 在JDk 中查找frame類裏面的addXxxListener類似的方法,找不到再從其父類中尋找
         */

        frame.addWindowListener(new MyWindowListener());

        Button button = new Button("Click Me");

        button.addActionListener(new MyListener());


        frame.add(button);

        frame.setSize(200, 200);

        frame.setVisible(true);

    }

}



class MyListener implements ActionListener{

    @Override
    @SuppressWarnings("deprecation")
    public void actionPerformed(ActionEvent e) {

        /*

         * 時間就是按格林威治時間:January 1, 1970, 00:00:00 GMT.到當前所經歷的毫秒數。
         * 將這個毫秒數轉化為時間
         */

        long milliSeconds = e.getWhen();

        /*
         * 查看JDK Doc文檔中的Date類的 public Date(long date)
         */

        Date date = new Date(milliSeconds);



        System.out.println(date.toLocaleString());

    }

}



class MyWindowListener implements WindowListener{



    @Override
    public void windowOpened(WindowEvent e) {

        // TODO Auto-generated method stub
    }



    @Override
    public void windowClosing(WindowEvent e) {

        System.out.println("關閉窗口");

        System.exit(0); //推出Java虛擬機

    }



    @Override
    public void windowClosed(WindowEvent e) {

        // TODO Auto-generated method stub



    }



    @Override

    public void windowIconified(WindowEvent e) {

        // TODO Auto-generated method stub



    }



    @Override
    public void windowDeiconified(WindowEvent e) {

        // TODO Auto-generated method stub



    }



    @Override
    public void windowActivated(WindowEvent e) {

        // TODO Auto-generated method stub



    }



    @Override
    public void windowDeactivated(WindowEvent e) {

        // TODO Auto-generated method stub



    }



}

編譯執行結果產生一個窗口,這裏不截圖出來了,輸出以下內容:

2013-1-13 21:25:39

關閉窗口

下面我們聯系以下兩個監聽器的使用方法:

Demo程序如下所示:


package com.ahueir.awt;

import java.awt.BorderLayout;  
import java.awt.Frame;  
import java.awt.Label;  
import java.awt.TextField;   
import java.awt.event.MouseEvent;   
import java.awt.event.MouseListener;   
import java.awt.event.MouseMotionListener;   

public class TwoListen implements MouseListener, MouseMotionListener{

    private Frame frame;

    private TextField textField; //文本框


    @Override
    public void mouseClicked(MouseEvent e) {

        // TODO Auto-generated method stub

    }



    @Override
    public void mousePressed(MouseEvent e) {

        // TODO Auto-generated method stub
    }



    @Override
    public void mouseReleased(MouseEvent e) {

        // TODO Auto-generated method stub
    }



    @Override
    public void mouseEntered(MouseEvent e) {

        // TODO Auto-generated method stub

    }



    //當鼠標退出Frame後,在命令行中打印出信息
    @Override
    public void mouseExited(MouseEvent e) {

        String str = "The mouse has left the Frame";

        this.textField.setText(str);
    }





    //鼠標拖動的時候,註意是點擊拖動
    @Override
    public void mouseDragged(MouseEvent e) {

        /*
         * 對於圖形界面來說,窗口的坐上角是起點
         */

        String str = "x: " + e.getX() + ", y:" + e.getY();  

        this.textField.setText(str); //將鼠標拖動獲得的信息加到文本框中
    }



    @Override
    public void mouseMoved(MouseEvent e) {

        // TODO Auto-generated method stub

    }



    public void go(){

        frame = new Frame("Two Listener Example");

        frame.add(new Label("click"), BorderLayout.NORTH); //添加一個 Label:標簽

        textField = new TextField(30); //表示文本框的長度為30

        frame.add(textField, BorderLayout.SOUTH);

        frame.addMouseMotionListener(this); //使用this表示直接使用本類中當前的對象

        frame.addMouseListener(this);

        frame.addMouseListener(new MyMouseListener());

        frame.setSize(300, 200);

        frame.setVisible(true);

    }

    public static void main(String[] args) {

        TwoListen two = new TwoListen();

        two.go();

    }

}





class MyMouseListener implements MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub

    }



    @Override
    public void mousePressed(MouseEvent e) {

        // TODO Auto-generated method stub

    }



    @Override
    public void mouseReleased(MouseEvent e) {

        // TODO Auto-generated method stub
    }



    @Override
    public void mouseEntered(MouseEvent e) {

        String str = "The mouse has entered the Frame";

        System.out.println(str);

    }



    @Override
    public void mouseExited(MouseEvent e) {

        String str = "The mouse has exited the Frame";

        System.out.println(str);

    }

}

編譯執行結果如圖所示:
技術分享圖片

【說明】:對於同一個事件源,註冊兩個同種類型的監聽器是沒有問題的,而且他們同時的都會發生作用。如下圖所示:

技術分享圖片

【說明】:同一個事件源觸發三種相同的事件類型,這三個事件處理器都會執行

監聽器、事件、事件源、事件註冊深度剖析