先看ListModel。
ListModel是一個interface,主要的功能是定義一些方法,讓JList或JComboBox這些元件取得每個項目的值,并可限定項目的顯示 時機與方式,下面為ListModel這個interface所定義的方法:
ListModel interface定義的方法:
還記得我們一開始在介紹JList時所提到的構造函數嗎?其中有一個JList的構造函數是這樣的:
JList(ListModel dataModel)
實作JList常用方法:
DefaultListModel m=new DefaultListModel();
for(int i=0;i<10;i++){
m.addElement(...);
}
jlist.setModel(m);
是以我們必須實作ListModel所有的方法,才能利用上面這個構造函數建立JList.不過要實作ListModel所有的方法有點麻煩,因 為一般我們不會用到addListDataListener()與removeListDataListener()這兩個方法。是以java提供了AbstractListModel這個抽 象類,此抽象類實作了addListDataListener()與removeListDataListener()這兩個方法。若我們繼承AbstractListModel,就不需 實作這兩個方法,隻需要實作getElementAt()與getSize()方法即可,我們來看下面的範例:
事實上,java本身還提供另一個類,DefaultListModel實體類。此類繼承了AbstractListModel抽象類,并實作裡面所有的抽象方 法,是以你不需要再自行實作任何的方法,可以說是相當的友善。不過既然所有的抽象都已經被實作,是以在設計的彈性上就會有 有所降低。若你是喜歡自行管理JList項目的設計者,你可以不要使用DefaultListModel這個類,隻需要在AbstractListModel上多 下功夫即可。
下面的例子我們改寫上面的例子,直接使用DefaultListModel類:
程式運作結果與上個範例相同。
好奇怪,這不是跟我們使用Vector方式,利用JList(Vector v)構造函數來建立新的JList一樣嗎?如同JList1.java中的例子,為 什麼還要多此一舉呢?其實若讀者去檢視DefaultListModel類,可發現此類提供不少好用的方法,例如你可以随意的增加一個項目( addElement())、或是删除一個項目(removeElement)、甚至你可以很友善地做到查詢(getElementAt())與彙出(copyInto())項目的 操作。你可以發現,利用DefaultListModel可以直接動态地更改JList的項目值,而不需要自行産生一個Vecotr對象;相對于JList( Vector v)這個構造函數,可說更友善且實用許多.
至于利用ListModel或AbstractListModel來構造JList有什麼好處?讀者隻要這麼想,ListModel中文就是“列出模式”,那麼每 個老師都會有自己開課的學生成績,老師應該可以看到每個同學的成績,而深長應該隻能看到自己的成績,是以我們就會有兩種不 同的“列出模式”。我們隻需要去改寫getElementAt()方法,就會有不同的列出模式産生,如下面的範例:
via:
http://www.iteedu.com/plang/java/jtswingchxshj/27.php