2013-08-20 2 views
0

Я создал класс ComboBoxModel, который расширяет AbstractListModel. Я могу добавить элемент в выпадающем списке, но когда я пытаюсь удалить, я получаю исключениеComboBoxModel - removeItem метод для исключения fireIntervalRemoved throws

Исключение в потоке «АВТ-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--; 
    } 

} 
+3

Трассировка стека кажется довольно прямо вперед, я предложил бы использовать 'DefaultComboBoxModel', хотя из-за его простота. Похоже, вы ничего не делаете * special * с вашей моделью, которую 'DefaultComboBoxModel' еще не делает, поэтому на самом деле нет смысла изобретать колесо. –

ответ

1

Провод thisfire* методы в модели. Источником события является модель, а не элемент.

documentation От:

источника - ListModel, что изменилось, как правило, «это»

+0

Это работает человек, спасибо большое! Должен ли я помещать 'this' также некоторые из них? –

+0

@ ИсаакТобин Извините, я не понимаю вопроса. – kiheru

+0

Я имею в виду, в каком-то другом методе огня? Должен ли я установить его для каждого метода огня? –

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 для указания проблемы с 1-м аргументом.