ArrayList到JList - 多个对象元素

时间:2016-09-06 22:46:06

标签: java eclipse arraylist jlist listmodel

我使用Eclipse,用Java编程。问题:

这就是我想要显示JList的方式:

1 - Dante
2 - William
3 - Jaime
etc...

现在,数字是对象的ID,名称也就是名称。

ArrayList被命名为TraitList。

这就是我把它作为"模型" Eclipse中Window Builder的JList中的属性:

TraitL.setModel(new AbstractListModel() {
        String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"};
        public int getSize() {
            return values.length;
        }
        public Object getElementAt(int index) {
            return values[index];
        }
    });

所以我改为:

TraitL.setModel(new AbstractListModel() {
        String [] values = new String [];
        for (int jln = 0; jln < TraitList.size(); jln++){
            values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
        }
        public int getSize() {
            return values.length;
        }
        public Object getElementAt(int index) {
            return values[index];
        }
    });

它没有用。我尝试过几十种变体。没有用。那么,如何通过此列表显示对象的多个元素?我不在乎它是DefaultListModel还是AbstractListModel,甚至不是ListModel。 提前谢谢。

编辑:我尝试过的所有行的错误如下图所示: errors

奖金问题: 如何在此列表的元素中单击&#34; actionPerformed&#34;所以点击它后发生了什么事?

4 个答案:

答案 0 :(得分:0)

我认为该行

String [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);

应该是

values[jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);

正确?

答案 1 :(得分:0)

不需要将列表复制到本地变量。如果你愿意,你可以,但没有必要。以下是直接在模型中访问原始列表的示例:

public static void main(String[] args) {
    List<String> values = Arrays.asList("A", "B", "C");
    JList list = new JList(new AbstractListModel() {
        public int getSize() {
            return values.size();
        }

        public Object getElementAt(int index) {
            return index + " - " + values.get(index);
        }
    });
    list.addListSelectionListener(e -> 
            System.out.println("Clicked " + list.getSelectedValue()));
    JFrame frame = new JFrame("List Test");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.add(list);
    frame.pack();
    frame.setVisible(true);
}

如果您特别希望它在模型内部的数组中,并且索引嵌入在值中,那么:

String[] valueCopy = IntStream.range(0, values.size())
    .mapToObj(i -> i + " - " + values.get(i))
    .toArray(new String[0]);
public int getSize() {
    return valueCopy.length;
}

public Object getElementAt(int index) {
    return valueCopy[index];
}

答案 2 :(得分:0)

new AbstractListModel() {
    String [] values = new String [];
    for (int jln = 0; jln < TraitList.size(); jln++){
        values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
    }
    public int getSize() {
        return values.length;
    }
    public Object getElementAt(int index) {
        return values[index];
    }
}

这是一个无效的匿名类定义,你已经在类体中浮动了代码。

可以通过将初始化移动到私有方法来修复它:

String [] values = initTraitList();
private String[] initTraitList() {
    String [] values = new String [TraitList.size()];
    for (int jln = 0; jln < TraitList.size(); jln++){
        values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
    }
    return values;
}

或使用实例初始化块:

String [] values = new String [TraitList.size()];
{
    for (int jln = 0; jln < TraitList.size(); jln++){
        values [jln] = (TraitList.get(jln).id + " - " + TraitList.get(jln).Name);
    }
}

答案 3 :(得分:0)

没有模型就可以实现:

String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"};
JList jlist = new JList(values);
scrollpane = new JScrollPane(jlist);
scrollpane.setViewportView(jlist);