便於理解java監聽機制的簡單案例
阿新 • • 發佈:2019-01-04
效果圖如下:
滑鼠點選黑色,中間變成黑色,點選紅色,中間變成紅色。
如圖,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("貓貓也知道你按了紅色按鈕!"); } } }