[英]Custom list model not updating JList
因此,我制作了這個自定義ListModel,但是當我調用addElements
和extractElements
時,它並沒有更新在關聯的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.