ArrayList 到 JList - 不止一个对象元素

ArrayList to JList - More than one object element

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

这就是我希望我的 JList 的显示方式:

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

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

ArrayList 被命名为 TraitList。

这是我在 Eclipse 的 Window Builder 的 JList 中将其作为 "model" 属性 时得到的结果:

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];
        }
    });

没用。我已经尝试了数十种变体。 None 成功了。那么,如何让这个列表显示一个对象的多个元素呢?我不关心它是 DefaultListModel 还是 AbstractListModel,甚至是 ListModel。 提前致谢。

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

奖金问题: 如何使单击此列表的元素成为 "actionPerformed",以便在我单击它后发生某些事情?

我觉得行

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

应该是

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

对吗?

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

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];
}
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];
    }
}

这是一个无效的匿名 class 定义,您的代码在 class 正文中浮动。

可以通过将初始化移至私有方法来解决此问题:

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);
    }
}

不用模型也能实现:

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