所以我制作了这个自定义ListModel,但是当我调用addElements
和extractElements
时,它并没有更新关联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;
}
}
这是一些旧的代码,我忘了在一个不同的课程中清理干扰这个但不是别的什么。 我会删除这个问题,但我不能。
答案 0 :(得分:3)
JList将使用xxxxx
和getSize()
方法来确定要显示的元素数量。你没有实现这些方法所以我猜你会得到一个空模型。
不要扩展AbstractListModel。而是扩展getElementAt()
并使用该类提供的存储(因此不需要Vector)。
然后在扩展类中实现addElements()和extractElements()方法。然后,您的循环代码将仅使用DefaultListModel
类提供的方法,如循环内的DefaultListModel
和addElement(...)
来添加/删除元素,这些方法将触发正确的事件。
答案 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);
}
}