Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: GUI и Java FX приложения > Изменение элемента ComboBox'a


Автор: m9yt 9.5.2011, 16:50
Привет всем.
ComboBox у меня использует свою модель.
Код

public class UniqueComboBoxModel extends DefaultComboBoxModel{
    private Set<Object> set;

    public UniqueComboBoxModel() {
        super();
        set = new HashSet<Object>();
    }

    @Override
    public void addElement(Object anObject)
    {
        if (!set.contains(anObject))
        {
            set.add(anObject);
            super.addElement(anObject);
        }
    }

        @Override
        public Object getElementAt(int index)
        {
            Object [] obj = set.toArray();
            return obj[index];
        }

        @Override
        public void insertElementAt(Object anObject, int index)
        {
            if (!set.contains(anObject))
            {
                set.add(anObject);
                super.insertElementAt(anObject, index);
            }
        }

        @Override
        public void removeElementAt(int index)
        {
            Object o = getElementAt(index);

            // if o == null, then there is no such element
            if (o != null)
            {
                set.remove(o);
                super.removeElementAt(index);
            }
        }

        @Override
        public void removeAllElements()
        {
            set.clear();
            super.removeAllElements();
        }
}


Т.е. на форме есть ComboBox, к которому применено
Код

DefaultComboBoxModel model = new UniqueComboBoxModel();
jComboBox1.setModel(model);


Пытаюсь удалить элемент и вставить на его место новый, но вылетает исключение:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException
Код

model.removeElementAt(i); // i = jComboBox1.getSelectedIndex();
model.insertElementAt(((Administration)obj).getTel(), i);


Компилятор указывает на метод
Код

public Object getElementAt(int index)
        {
            Object [] obj = set.toArray();
            return obj[index];
        }

Т.е. как бы индекс вне диапазона, хотя я выбрал конкретный элемент.
Если просто вызвать getElementAt, то все работает.

Автор: Stolzen 9.5.2011, 19:17
Стектрейс можно? 
Я когда писал этот класс, проверял только getElementAt - видимо что-то недосмотрел

Автор: m9yt 9.5.2011, 19:41
Цитата(Stolzen @ 9.5.2011,  19:17)
Стектрейс можно? 
Я когда писал этот класс, проверял только getElementAt - видимо что-то недосмотрел

Как его сделать?(стектрейс)
Кстати, getElementAt я сам добавил.

Может это?
http://s1.ipicture.ru/

Автор: Stolzen 16.5.2011, 08:42
Цитата(m9yt @  9.5.2011,  20:41 Найти цитируемый пост)
Кстати, getElementAt я сам добавил.

А зачем вы тогда ее добавляли? Он и так нормально реализован. Для проверки изменил getElementAt на следующее:

Код

    @Override
    public Object getElementAt(int index) {
        Object res = super.getElementAt(index);
        System.out.println(res);
        return res;
    }


Все нормально работает, так что его можно (нужно) удалить.

Автор: Krivoy 21.5.2011, 22:33
Обьясните нубу почему\зачем здесь
Код

DefaultComboBoxModel model = new UniqueComboBoxModel();

а не
Код

UniqueComboBoxModel model = new UniqueComboBoxModel();

?

Автор: aleksandy 23.5.2011, 09:44
Если далее у model не используются методы определенные в DefaultComboBoxModel, то строку вообще можно заменить на 
Код
ComboBoxModel model = new UniqueComboBoxModel();
. Это обыкновенное абстрагирование.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)