2013-06-21 32 views
1

我試圖ArrayList中添加的jList,但我給予理解的唯一途徑就是寫這樣的代碼:爲什麼我不能直接添加ArrayList到Jlist?

ArrayList<String> labels = new ArrayList<String>(); 
JList jlist = new JList(labels.toArray()); 

請告訴我困惑我的是,爲什麼我不能只是添加的ArrayList到的jList直接像這樣:

ArrayList<String> labels = new ArrayList<String>(); 
JList jlist = new JList(labels); 

在此先感謝。

+0

'「什麼困惑我的是,我爲什麼不能只需像這樣直接將ArrayList添加到Jlist:「'---因爲我們不能只編寫代碼並希望它可以工作。該API會告訴你具體的構造函數和方法。你用得越多,它會變得越有用。 –

+1

如果你真的很煩惱,創建一個'ListModel',它使用'List'作爲它的核心支持數據... – MadProgrammer

+0

另請參見:http://stackoverflow.com/a/3269560/363573 – Stephan

回答

6

的「幫手」構造列入是爲了使其更容易與簡單的數據結構使用JList

JList(和許多Swing組件)實際上是用於將實際數據提供給視圖的模型。原始設計在Swing被合併到主庫之前(在JDK 1.3之前)並且剛好在集合API被引入之前就回去了,所以原始開發者可能沒有List可用於他們(因此包括Vector)。

這可能是因爲沒有人認爲可以更新庫,因爲(部分原因是因爲它可能已被決定,原來的構造函數不應該被包括在內,但我並沒有在該次會議;))

更好/更簡單的解決方案是創建自己的模型,使用List作爲數據源。

例如...

public class MyListModel<T> extends AbstractListModel<T> { 

    private List<T> people; 

    public MyListModel(List<T> people) { 
     this.people = people; 
    } 

    @Override 
    public int getSize() { 
     return people.size(); 
    } 

    @Override 
    public T getElementAt(int index) { 
     return people.get(index); 
    } 
} 

然後,你可以簡單地把它提供給JList當過你需要......

JList myList = new JList(new MyListModel<MyObject>(listOfMyObjets)); 
+0

+1不錯解 – nachokk

2

因爲JList沒有接受一個ArrayList(或List)構造函數。它只能接受數組,ListModelVector。見the documentation

一個ArrayList不是一個數組。您不能將ArrayList傳遞給需要數組的方法。

2

很簡單。 JList的構造並不指望的ArrayList

JList() 
Constructs a JList with an empty, read-only, model. 
JList(E[] listData) 
Constructs a JList that displays the elements in the specified array. 
JList(ListModel<E> dataModel) 
Constructs a JList that displays elements from the specified, non-null, model. 
JList(Vector<? extends E> listData) 
Constructs a JList that displays the elements in the specified Vector. 
相關問題