2011-07-18 58 views
3

我寫了一個包含Deque<T>的類(讓我們稱之爲Model.java),其中包含排列和排列項目的方法。現在我試圖將它與GUI JList綁定。我很困惑如何以某種方式使用我的「模型」數據 - Deque - 作爲JList想要的DefaultListModel。我仍然在努力實現面向對象的概念,因爲它們適用於GUI編程。 DefaultListModel文檔指出:如何將Java Deque <T>轉換爲DefaultListModel?

此類以鬆散方式實現java.util.Vector API,它實現java.util.Vector中的1.1.x版本的,沒有collection類支持,並通知ListDataListeners變化時發生。目前其委託給一個Vector ....

有一些辦法讓DefaultListModel用我Deque<T>,而不是一個向量,因此允許我Model.java代碼基本保持不變,同時提供所有的聆聽/通知行爲是免費的?或者我必須重寫Model.java才能使用DefaultListModel而不是Deque<T>

+0

+1好的初學者問題。歡迎來到SO! –

回答

5

請注意,JList構造函數採用ListModel(接口),而不是DefaultListModel(實現)。這是OO原則(合同),指定JList可以使用恰好實現ListModel接口的ANY對象。從Java教程Object Oriented Programming Concepts

接口是一個類和外部世界之間的契約。當一個類實現一個接口時,它承諾提供由該接口發佈的行爲 。

由於ListModel只有四種方法,它應該是很容易爲你的類加以落實,並委託運營到內部Deque。您的班級應聲明爲

public class Model implements ListModel 
{ 
    .... 

並且將包含四個附加的方法來實現ListModel的方法。在JavaDoc中,實現可以根據需要做任何事情,但必須遵守ListModel的定義以及在ListModel合同中指定的任何行爲。

完成此操作後,您可以構建一個JList,將類Model的實例傳遞給構造函數。

+0

謝謝 - 這是非常有幫助的。這是否真的意味着,只要我提供了一個AddListDataListener()方法,我不需要關心什麼時候或如何「告訴」聽衆我的Deque發生了重大變化? – Chap

+0

好吧 - 我將模型類聲明爲實現ListModel,並插入了四個方法存根。 getSize()和getElementAt()很容易實現,但我不知道該怎麼做addListDataListener(),所以我把它留空。因此,雖然我能夠將對象添加到我的雙端機,並稍後檢索它,但它並未出現在GUI中。閱讀文檔,我發現將ListDataEvents發送到ListDataListeners是我的責任。所以我認爲我實際上必須實現_another_ list,只是爲了保留和遍歷我的聽衆?併發送他們事件,當我改變的東西?哇。 – Chap

+0

是的,就是這樣。如果你的類沒有擴展任何其他的東西,你可以擴展'DefaultListModel'(這會讓你自動實現'ListModel'),然後委派監聽器處理它。如果默認實現與您的類的其他所有功能兼容,那麼只需將這些方法全部從您的類中取出,並且超類實現將被調用。但是,您仍然必須通知聽衆更改。 –

1

對於JList,你必須使用DefaultListModel,只是ListModel執行界面。後者可以通過使用Deque來實現。

+0

對不起,編輯虛假。 – trashgod

1

我不知道該怎麼爲addListDataListener()

AbstractListModel做可能是一個很好的起點,因爲它已經實現了規定EventListenerList的方法來處理的聽衆和事件。

+0

這對我來說確實是最好的方法,作爲初學者。它提請注意「EventListenerList」的存在以及通知聽衆的過程,而不需要我首先實現這些細節。 – Chap