2013-06-21 7 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», который использует «Список», поскольку это основные данные поддержки ... – 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 nice решение – nachokk

3

JList не имеет конструктора, который принимает List. Первый пример работает, поскольку он использует конструктор JList(Object[]).

Ознакомьтесь с javadoc

2

Потому что JList не имеет конструктор, который принимает ArrayList (или List). Он может принимать только массив, ListModel или Vector. См. 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.