【问题标题】:Custom list model not updating JList自定义列表模型不更新 JList
【发布时间】:2016-02-16 02:59:43
【问题描述】:

所以我创建了这个自定义 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;
}
}

更新:已解决

这是一些我忘记在不同的类中清理的旧代码,它会干扰这个,但不会以某种方式干扰其他任何东西。 我只想删除这个问题,但我不能。

【问题讨论】:

    标签: java swing jlist


    【解决方案1】:

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

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

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

    【讨论】:

    • 我不知道,也许你可以创建一个实际上由ArrayList 支持的,这样你就可以通过传递List 来填充,我会支持的;)
    • 我实际上是从扩展DefaultListModel 开始的,但是我需要在班级的其他部分对向量做一些棘手的事情,并且需要直接访问它,所以我选择尝试这个。我也实现了getSize()getElement() 我只是省略了我的大部分课程。
    • 更新:+1 让我意外地解决了它。与我仍在扩展 DefaultListModel 时不同的类中遗留了一些代码,这会破坏它。
    • but I need to do some tricky things with the vector in other parts of my class - 这不是一个合适的解决方案。只有模型应该负责更改数据。
    【解决方案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);
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-20
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多