为什么我不能直接将ArrayList添加到Jlist?

时间:2013-06-21 01:43:09

标签: java swing 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);

提前感谢。

4 个答案:

答案 0 :(得分:7)

包含“helper”构造函数是为了更容易使用简单数据结构的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));

答案 1 :(得分:3)

JList没有接受List的构造函数。第一个示例使用构造函数JList(Object[])

熟悉javadoc

答案 2 :(得分:2)

因为JList没有接受ArrayList(或List)的构造函数。它只能接受数组,ListModelVector。请参阅the documentation

ArrayList不是数组。您无法将ArrayList传递给想要数组的方法。

答案 3 :(得分: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.