-1

我正在使用 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。提前致谢。

编辑:我尝试过的所有行的错误都在下图中: 错误

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

4

4 回答 4

0

我认为这条线

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

应该

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

对?

于 2016-09-06T22:54:55.530 回答
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];
}
于 2016-09-06T23:52:51.360 回答
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);
    }
}
于 2016-09-06T23:59:56.637 回答
0

它可以在没有模型的情况下实现:

String [] values = new String[] {"1 - Dante", "2 - William", "3 - Jaime"};
JList jlist = new JList(values);
scrollpane = new JScrollPane(jlist);
scrollpane.setViewportView(jlist);
于 2016-09-07T10:49:49.127 回答