2012-08-28 86 views
0

當我們實現Listener,Renderer或Editor時,裏面的方法如何自動調用Java?如何調用接口方法和抽象方法的默認值?

代碼:

Class A implements ActionListener{ 
    A(){ 
    //bla bla 
    //bla bla 
    this.addActionListener(btn); 

    } 
    public void actionPerformed(ActionEvent e){**// How actionPerformed method called  //automatically if we register button** 

    } 
} 

如何了呼叫actionPerformed方法註冊按鈕對象後自動?我們只是將btn對象傳入addActionListener(btn)。其調用方法如何?

我通過addActionListener方法*內的netbeans檢查。有沒有調用方法actionPerformed方法。另外,如果我們註冊它繼續工作。以內的任何地方是否使用線程調用?但我檢查了源代碼。 什麼都沒有。怎麼樣?

+0

我覺得你的邏輯向後(從代碼示例的角度至少),我認爲這應該是'btn.addActionListener(this);' – MadProgrammer

+1

請嘗試用正確的英文寫,不要使用所有這些縮寫... – home

+0

這完全是關於回調函數:http://en.wikipedia.org/wiki/Callback_(計算機程序設計) – home

回答

3

使用API中概述的約定和here討論的約定,從父母JComponent擁有的EventListenerList分派事件。 Editors and Renderers由擁有的視圖組件引起。

附錄:我們可以創建相同的接口嗎?怎麼樣?

是的,JFreeChart是一個相當容易理解的例子。雖然圖表本身不是JComponent,但它使用same model作爲其自己的events

+0

非常感謝..很好...... – shree

1

Swing在發生操作時自動調用ActionListener。實際的方法調用位於Swing源代碼的深處。

+0

我認爲不僅在Swing中......所有內置的接口和Java中的抽象類中的大多數都只是在相同的概念下工作......我們可以創建相同的接口嗎? – shree

+0

@shree 1.你在這裏問或告訴? 2.如果您問是否可以創建界面,當然可以,但您也必須組織某人來調用它。它不只是通過魔法發生。 – EJP

2

在Java中,任何這恰好在組分通過處理的任何窗口Event Dispatcher Thread

的事件指派線程(EDT)是Java 使用後臺線程以處理從抽象窗口工具包的事件(AWT)圖形 用戶界面事件隊列。這些事件主要是更新事件 ,可導致用戶界面組件重繪自己,或從輸入設備(如鼠標或鍵盤)輸入事件 。

每當你點擊或做一些事件,它是踢開始動作偵聽器,這就是爲什麼在你的行動聽衆做任何Thread.sleep最終將凍結UI進行了一段時間的EDT。

由於您的課程實現了給定的接口,因此您的課程將保證EDT將擁有EDT可用於執行任何需求的一系列方法。

有關EDT的更多信息,請查看this Oracle文檔。

+0

+1例如睡在EDT例子 – MadProgrammer

2

這很神奇。

通過AWT API來處理事件處理。然後將這些事件排隊並分發給各個組件(通過嚴格的步驟)。然後,每個感興趣的團隊在處理那些他們感興趣的請求之前,將它們傳遞到食物鏈,直到它到達您。

問題是,你應該關心嗎?

在某些方面是的,但你是否在意電力是如何工作的或只是你可以打開電燈開關?

我敢肯定有更好的文檔,但你可以看看http://docs.oracle.com/javase/1.3/docs/guide/awt/designspec/events.html對於初學者...