【问题标题】:Java Swing using JList with an ArrayList<>Java Swing 使用带有 ArrayList<> 的 JList
【发布时间】:2012-03-25 04:06:03
【问题描述】:

基本上,我有一个包含 CD ArrayList 实例的 CD 库,然后我有一个 people ArrayList 可以“借用”CD...从该 CD 中添加到可用的,或不可用的列表。

public CDStore(String storeNme) {
        storeName = storeNme;
        discsArray = new ArrayList<CD>();
        peopleArray = new ArrayList<Person>();
    }

通过使用 JList,我试图使列表中的元素等于 CD 的实例。

所以...列表中的 item1 将是索引 0 处的 CD,item 2 = 索引 1 等等....

String[] entries = ??????????????????;
        JList listOfCD = new JList(entries);
        listOfCD.setVisibleRowCount(4);
        JScrollPane listPane = new JScrollPane(listOfCD);
        JTextField valueField = new JTextField("None", 7);

谢谢。

【问题讨论】:

  • 您是否只是想获取列表中显示的 CD 名称?
  • 基本上,是的......只是希望 discsArray 的元素成为元素条目

标签: java swing arraylist jlist


【解决方案1】:

您的CDStore 可以实现接口ListModel。你可以使用CDStore 作为JList 的模型。

CDStore store = new CDStore("Store");
// add some CDs

JList listOfCD = new JList(store);
listOfCD.setVisibleRowCount(4);
JScrollPane listPane = new JScrollPane(listOfCD);
JTextField valueField = new JTextField("None", 7);

这是CDStore implements ListModel 的示例实现。每次discsArray 更改时,您都应该调用方法fireContentsChanged

public class CDStore implements ListModel {
    private String storeName;
    private List<CD> discsArray;
    private List<Person> peopleArray;

    public CDStore(String storeNme) {
        storeName = storeNme;
        discsArray = new ArrayList<CD>();
        peopleArray = new ArrayList<Person>();
    }

    //your methods

    //ListModel
    private List<ListDataListener> listener = new ArrayList<ListDataListener>();

    public void addListDataListener(ListDataListener l) {
        listener.add(l);
    }

    public void removeListDataListener(ListDataListener l) {
        listener.remove(l);
    }

    protected void fireContentsChanged() {
        for (ListDataListener l : listener) {
            l.contentsChanged(new ListDataEvent(this, ListDataEvent.CONTENTS_CHANGED, 0, discsArray.size()-1));
        }
    }

    public Object getElementAt(int index) {
        return discsArray.get(index);
    }

    public int getSize() {
        return discsArray.size()
    }
}

【讨论】:

  • +1 还可以考虑扩展AbstractListModel 以利用某些方法的现有实现。
【解决方案2】:

如果你有一个检索 CD 名称的方法,我们称之为 getCDName(), 你可以试试

String[] entries = new String[discsArray.length];
int index = 0;
for (CD cd: discsArray) {
     entries[index++] = cd.getCDName();
}

这应该填写您的条目数组。

【讨论】:

  • 试过你说的,但我们从另一个类调用 discsArray ......但无论出于何种原因,它都不允许我使用 discsArray 并要求我创建方法等。无论如何解决这个问题?
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2013-05-17
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多