事件監聽:
這是個很重要的概念,也是個很重要的模型,vb,vc都是這樣用,甚至后面學的web框架也在用。 現在我們可以做很多按鈕了吧,但是我們的按鈕按它是沒反應的,現在我們來看看怎么樣才能讓它有反應。
先看個例子:
import java.awt.*; import java.awt.event.*; public class TestActionEvent { public static void main(String[] args) { Frame f = new Frame("Test"); Button b = new Button("Press me!"); Monitor bh = new Monitor(); b.addActionListener(bh);//把這個監聽器添加到button上面 f.add(b,BorderLayout.CENTER); f.pack();//窗口包圍按鈕 f.setVisible(true); } } class Monitor implements ActionListener { public void actionPerformed(ActionEvent e) { //重寫了接口ActionListener的這個方法 System.out.println("a Button has been pressed!"); } }
這里的button一按,就會調用監聽的這個方法,你想一下如果想讓它一按就自動執行,是不是要把方法名告訴它,可是人家的button怎么知道你的方法名呢? 辦法是這樣的,方法實現某一接口,然后button里面也照着這個接口來調用實際當中的對象。 所以它不用知道它調的是哪個類的哪個方法,你只要實現了這個接口,它只要調用接口里的方法就行了。
事件源對象,也就是發生這件事的component的。
事件有很多種,比如按鼠標啊,拖動鼠標什么的,所以監聽的這件事的要求你實現的接口也要分好多種,你想監聽某件事,就得實現某個接口。 事件和監聽這個事件的接口一一對應。
注冊,是個動作,把自己的監聽器的某一個對象,注冊到我們的事件源對象上,事件源對象就知道有誰在監聽我了。
還有一個細節,當某個事情發生的時候,這件事具體的信息要告訴監聽器吧,比如點鼠標,點哪哪彈出個對話窗口,你要告訴監聽器我特么點的坐標在哪吧。 所以當某件事發生的時候你必須把這件事封裝成一個對象作為參數傳遞給我監聽器的接口的里面那個特定的方法。
所以看這句代碼: public void actionPerformed(ActionEvent e)
這個方法有個參數e,關於這件事的具體信息系統會把它包裝成對象傳遞到e里面。
btutton按下去的時候它發生的這件事叫做actionEvent,然后monitor實現的actionListener是這個事件對應的接口。
下面這個是一個監聽器監聽兩個按鈕:
有人會問這里這個監聽器怎么區分呢? 看這個 b2.setActionCommand("game over"); 在button這個類里面有個屬性叫acctionCommand,這句話就是把b2的actioncommand設成gameover。
b1沒有設這個actionCommand,那么它默認的就是它的名字。那有人又問了,不能直接用名字來區分嗎?可是現實中往往有這樣的情況,兩個按鈕的名字都是"關閉"。所以這里我們有個區分方法就是把一個actionCommand設為別的另一個actionCommand也設成不同的。這是其中的一個區分方法(但不是特別好)