簡體   English   中英

自定義列表模型不更新JList

[英]Custom list model not updating JList

因此,我制作了這個自定義ListModel,但是當我調用addElementsextractElements時,它並沒有更新在關聯的JList上可見的extractElements 我懷疑我沒有正確使用各種“射擊”方法,但是我自己看不到任何問題。 任何幫助表示贊賞,謝謝

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

更新:已解決

這是我忘記在另一個類中清除的一些舊代碼,它干擾了此代碼,但以某種方式沒有其他影響。 我只想刪除這個問題,但是不能。

JList將使用getSize()getElementAt()方法來確定要顯示多少個元素。 您沒有實現這些方法,所以我猜您會得到一個空模型。

不要擴展AbstractListModel。 而是擴展DefaultListModel並使用該類提供的存儲空間(因此不需要Vector)。

然后,只需在擴展類中實現addElements()和extractElements()方法即可。 然后,您的循環代碼將只使用DefaultListModel類提供的方法,例如循環內的addElement(...)remove(...)來添加/刪除元素,這些方法將觸發適當的事件。

此代碼不處理整數數組參數中的重復元素,例如:{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);
}
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM