0

我创建了一个扩展 AbstractListModel 的 ComboBoxModel 类。我可以将项目添加到组合框,但是当我尝试删除时,出现异常

线程“AWT-EventQueue-0”中的异常 java.lang.IllegalArgumentException:空源

在线

this.fireIntervalRemoved(selectedItem, itemIndex, itemIndex);

public class TComboBoxModel extends AbstractListModel implements ComboBoxModel {

    private int itemIndex; 

    private Object selectedItem = null;
    private ArrayList<Object> itemList;

    public TComboBoxModel() {
        itemList = new ArrayList<>();
    }

    public void addItem(String item) {
        this.itemList.add(item);
        this.fireIntervalAdded(item, itemIndex, itemIndex);
    }

    public void removeItem() {
        if (itemIndex >= 0 && itemIndex < getSize()) {
            this.itemList.remove(itemIndex);
            this.fireIntervalRemoved(selectedItem, itemIndex, itemIndex);
        }
    }

    @Override
    public void setSelectedItem(Object anObject) {
        if ((selectedItem != null && !selectedItem.equals(anObject)) || selectedItem == null && anObject != null) {
            this.selectedItem = anObject;
            this.fireContentsChanged(anObject, -1, -1);
        }
    }

    @Override
    public Object getSelectedItem() {
        return selectedItem;
    }

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

    @Override
    public Object getElementAt(int index) {
        return itemList.get(index).toString();
    }

    public int getItemIndex() {
        return itemIndex;
    }

    public void increaseItemIndex() {
        itemIndex++;
    }

    public void decreaseItemIndex() {
        itemIndex--;
    }

}
4

2 回答 2

1

您可能应该将其更改为:

if (selectedItem != null) {
    fireIntervalRemoved(this, itemIndex, itemIndex);
}

因为除非您通过选定的项目知道要删除哪个项目,否则您无法删除项目。

您也必须itemIndex适当地设置变量。

public void setSelectedItem(Object anObject) {
    if ((selectedItem != null && !selectedItem.equals(anObject)) || selectedItem == null && anObject != null) {
        this.selectedItem = anObject;
        this.fireContentsChanged(anObject, -1, -1);
        itemIndex = ... index in itemList where anObject is located (or -1 if not found) ...
    }
}

感谢@kiheru 指出第一个论点的问题。

于 2013-08-20T21:50:27.007 回答
1

传递thisfire*模型中的方法。事件源是模型,而不是项目。

文档中:

source - 改变的 ListModel,通常是“this”

于 2013-08-20T21:50:52.297 回答