1. 程式人生 > >便於理解java監聽機制的簡單案例

便於理解java監聽機制的簡單案例

 效果圖如下:

 

 滑鼠點選黑色,中間變成黑色,點選紅色,中間變成紅色。

 如圖,java監聽機制至少需要這三點:事件源、事件、事件監聽者。

1.事件源:引起事件發生的物件。

2.事件(物件):比如你點選黑色按鈕就是一個事件,在java中事件是被當做一個事件物件對待的。

3.事件監聽者:當你點選滑鼠時,計算機怎麼知道你是否點選了呢?這時候事件監聽者就出場了,他就是監視你是否點選了滑鼠的監聽者。事件監聽者是類的物件,可以是發生這個事件的本身類的物件,也可以是其他類的物件。

他們之間的關係可以抽象為

具體操作時,就像我下面的程式碼一樣,當你定義完黑紅按鈕元件後,這兩個元件是引起事件發生的元件,他們是事件源。那麼我們就要找人(事件監聽者)監聽他們,也就是註冊監聽。這裡要注意:

jb1.addActionListener(this);
jb2.addActionListener(this);

這裡面的this指的是物件,而不是類名,如果要用其他類的話,先定義該類的物件,再讓他作為監聽者。就像下面的用cat而不是Cat作為監聽者。

註冊監聽完了之後我們要指定action命令,這個是幹啥的呢?我來解釋一下。當你為黑紅按鈕元件新增監聽者之後,監聽者並不能直接知道你是否點選了滑鼠,他要根據action命令的返回值判斷是否點選了滑鼠,也就是說action命令是個中介,如果你點選了jb1(黑色按鈕)的話,他會返回“黑”這個字串,當然返回值你可以自己隨便寫。而事件監聽者通過e.getActionCommand().equals("黑")   來判斷使用者點選了黑色按鈕。

 下面的案例還有個小功能,就是貓貓類,他可以讓你更加清楚監聽機制。我的貓貓在jb1上加了註冊監聽,而沒有在jb2上加,點選的時候,執行結果如下:

說明註冊監聽,action命令缺一不可。

至此,監聽機制講的差不多了 

完整程式碼如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Test extends JFrame implements ActionListener {
        //定義JPanel
        JPanel jp = null;
        JButton jb1 = null;
        JButton jb2 = null;

        public static void main(String[] args){
            Test test = new Test();
        }

        //解構函式
        public Test(){
            jp = new JPanel();
            jb1 = new JButton("黑色");
            jb2 = new JButton("紅色");
            //註冊監聽
            jb1.addActionListener(this);
            jb2.addActionListener(this);
            Cat cat = new Cat();
            jb1.addActionListener(cat);
            //指定action命令
            jb1.setActionCommand("黑");
            jb2.setActionCommand("紅");

            this.add(jb1,BorderLayout.NORTH);
            jp.setBackground(Color.blue);
            this.add(jp);
            this.add(jb2,BorderLayout.SOUTH);

            this.setSize(300,250);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
            this.setVisible(true);
        }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("黑")){
            System.out.println("你按了黑色按鈕!");
            jp.setBackground(Color.black);
        }else if(e.getActionCommand().equals("紅")){
            System.out.println("你按了紅色按鈕!");
            jp.setBackground(Color.red);
        }
    }
}

class Cat implements ActionListener{
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand().equals("黑")){
            System.out.println("貓貓也知道你按了黑色按鈕!");
        }else if(e.getActionCommand().equals("紅")){
            System.out.println("貓貓也知道你按了紅色按鈕!");
        }
    }
}