Качайте ComboBox с выбором «ни один из ниже» - PullRequest
1 голос
/ 01 февраля 2010

У меня совершенно нормальный ArrayList<MyObject>, который мне нужно отредактировать и выбрать объект.

В окне приложения у меня есть JComboBox, чтобы выбрать подходящий вариант из списка. Я пишу диалог редактора для этих объектов, который включает в себя JList этих объектов и полей редактора. Это достаточно легко сделать; У меня просто будет ListModel реализация какого-то рода. Вставьте ArrayList в, доступ к нему через обычные поля. Материал в списке GUI представляет собой 1: 1 представление материала в реальном списке. Легко.

Но поле со списком в главном окне приложения вызывает у меня небольшую головную боль, потому что мне нужно особое значение. В идеале первый элемент в списке должен быть «(Нет)» и возвращать null.

Мне просто нужно написать какую-то странную ComboBoxModel реализацию для этого или есть более простой, уже реализованный способ сделать это? Я определенно думаю, что подобная ситуация возникла раньше.

Ответы [ 2 ]

2 голосов
/ 01 февраля 2010

Реализация собственного ComboBoxModel должна быть довольно простой.

Поскольку это решение создает новый Vector из вашего ArrayList, изменения в yourArrayList после создания Vector не будут видны в вашем JComboBox. Если вам это нужно, вам придется реализовать собственную ComboBoxModel (см. DefaultComboBoxModel реализацию).

В любом случае, вам придется это сделать, поскольку не существует DefaultComboBoxModel конструктора, который бы принимал List.

class SpecialComboBoxModel extends DefaultComboBoxModel {
    public final static String NULL_ELEMENT = "<None>";

    public SpecialComboBoxModel(Vector v) {
        super(v);
    }

    @Override
    public int getSize() {
        return super.getSize() + 1;
    }

    @Override
    public Object getElementAt(int index) {
        if( index == 0) {
            return NULL_ELEMENT;
        }
        return super.getElementAt(index - 1);
    }
}


    ArrayList<String> yourArrayList = new ArrayList<String>();
    yourArrayList.add("Value1");
    yourArrayList.add("Value2");
    Vector<String> v = new Vector<String>(yourArrayList);
    dropdown.setModel(new SpecialComboBoxModel(v));
0 голосов
/ 01 февраля 2010

Возможно, вы захотите использовать нулевой объект. Например

public class MyObject {
   public static final MyObject NULL_OBJECT = new MyObject();

   ..
}

и затем в вашем ArrayList просто позвоните:

arrayList.add(0, MyObject.NULL_OBJECT);

Для вашего нулевого объекта все его свойства должны быть установлены на null (или на некоторые разумные значения по умолчанию), а ваш метод toString() (если вы его используете) должен вернуть "(нет)", если все поля null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...