自定义列表模型不更新JList

时间:2016-02-16 02:59:44

标签: java swing jlist

所以我制作了这个自定义ListModel,但是当我调用addElementsextractElements时,它并没有更新关联JList上可见的内容。我怀疑我没有使用各种"火"方法正确,但我自己也看不到任何问题。感谢任何帮助,谢谢

public class PartsList extends AbstractListModel {

    private Vector<String> parts;

    public PartsList() {
        parts = new Vector<String>();
    }

/**
 * Adds an array of Strings to this list
 * 
 * @param toAdd
 *            The array of Strings to add
 */
public void addElements(String[] toAdd) {
    for (String item : toAdd) {
        parts.addElement(item);
    }
    fireContentsChanged(this, 0, parts.size() - toAdd.length);
    fireIntervalAdded(this, parts.size() - toAdd.length, parts.size());
}

/**
 * Takes a list of indices and returns a String array of the
 * items at those indices while removing them
 * 
 * @param toGet
 *            The (sorted) int array containing the indices
 * @return String[] The items saved at the given indices
 */
public String[] extractElements(int[] toGet) {
    String[] items = new String[toGet.length];
    int i = 0;
    for (int item : toGet) {
        items[i] = parts.remove(item - i); // The -i cancels out the fact an item was removed in previous iterations
        System.out.println(item - i);
        i++;
    }
    fireIntervalRemoved(this, parts.size(), parts.size() + i);
    fireContentsChanged(this, 0, parts.size());
    return items;
}
}

更新:已解决

这是一些旧的代码,我忘了在一个不同的课程中清理干扰这个但不是别的什么。 我会删除这个问题,但我不能。

2 个答案:

答案 0 :(得分:3)

JList将使用xxxxxgetSize()方法来确定要显示的元素数量。你没有实现这些方法所以我猜你会得到一个空模型。

不要扩展AbstractListModel。而是扩展getElementAt()并使用该类提供的存储(因此不需要Vector)。

然后在扩展类中实现addElements()和extractElements()方法。然后,您的循环代码将仅使用DefaultListModel类提供的方法,如循环内的DefaultListModeladdElement(...)来添加/删除元素,这些方法将触发正确的事件。

答案 1 :(得分:2)

此代码不处理重复元素,例如:整数数组参数中的{1,2,1}。

要解决此问题,您可能需要使用一套。

class PartsList extends AbstractListModel<String> {

private final Vector<String> parts;

public PartsList() {
    parts = new Vector<>();
}

/**
 * Adds an array of Strings to this list
 *
 * @param toAdd The array of Strings to add
 */
public void addElements(String[] toAdd) {
    for (String item : toAdd) {
        parts.addElement(item);
    }
    fireContentsChanged(this, 0, parts.size() - toAdd.length);
}

/**
 * Takes a list of indices and returns a String array of the items at those
 * indices while removing them
 *
 * @param toGet The (sorted) int array containing the indices
 * @return String[] The items saved at the given indices
 */
public String[] extractElements(int[] toGet) {
    Arrays.sort(toGet);
    String[] items = new String[toGet.length];
    int i = 0;
    for (int item : toGet) {
        items[i] = parts.remove(item - i); // The -i cancels out the fact an item was removed in previous iterations
        i++;
    }
    fireContentsChanged(this, 0, parts.size());
    return items;
}

@Override
public int getSize() {
    return parts.size();
}

@Override
public String getElementAt(int index) {
        return parts.get(index);
}
}