Установите значение и метку в JComboBox

У меня есть JComboBox, где элементы являются результатами запроса. Комбинация показывает все имена категорий, взятые из запроса, верно? Хорошо, это работает. Теперь мне нужно дать каждому элементу значение, которое будет идентификатором продукта.

Это то, что у меня есть до сих пор:

    final JComboBox proveedorCombo = new JComboBox();

    contentPanel.add(proveedorCombo);

    ProveedorDAO dao = new ProveedorDAO();

    List<Proveedor> proveedor = dao.getAll();

    Object[][] elementos = new Object[proveedor.size()][2];

    for (int i = 0; i < proveedor.size(); i++) {
        Proveedor p = proveedor.get(i);
        elementos[i][0] = p.getId();
        elementos[i][1] = p.getNombre();
        proveedorCombo.addItem(elementos[i][1]);
    }

Как вы можете видеть в коде, «метка» каждого элемента — это его имя. Теперь, как я могу установить для каждого элемента его идентификатор, чтобы я мог манипулировать им после?

Спасибо и попытайтесь ответить легко, мне очень трудно получить эту вещь Java! Ха!


person Agustín    schedule 02.08.2013    source источник


Ответы (1)


JComboBox по умолчанию использует средство визуализации, которое использует метод toString() для отображения данных объекта. Таким образом, вы можете создать свой собственный класс рендеринга для настройки представления.

Именно для этого он и был разработан.

proveedorCombo.setRenderer( new DefaultListCellRenderer(){

        @Override  
        public Component getListCellRendererComponent(
            JList list, Object value, int index,
            boolean isSelected, boolean cellHasFocus)
        {
            super.getListCellRendererComponent(list, value, index,
                isSelected, cellHasFocus);

                if(value != null){
                 Proveedor proveedor = (Proveedor)value;
                 setText( proveedor.getName());
                }
            return this;
        }
});

Другой хакерский подход заключается в переопределении toString() из Proveedor или создании вашего класса адаптера, который использует ваш toString(), но это решение не так гибко, как другое.

public class Proveedor {

//in some part
@Override
public String toString(){
    return this.nombre;
}

}

В поле со списком, если вы хотите заполнить с нуля.

proveedorCombo.setModel(new DefaultComboBox(new Vector<Proveedor>(dao.getAll())));

Или если у вас есть предыдущие данные, и вы хотите сохранить.

for(Proveedor p : dao.getAll){
    proveedorCombo.addItem(p);
}
person nachokk    schedule 02.08.2013
comment
-1 для переопределения toString по причинам view, можно использовать собственный рендерер - person kleopatra; 03.08.2013
comment
Да, вы правильно поняли ... я использую простой способ, я помещаю класс адаптера в качестве рендеринга, но никогда не буду редактировать пример. - person nachokk; 03.08.2013
comment
хорошая попытка - просто недостаточно хороша, когда я ищу грязные подходы ‹g› Два варианта означает, что оба будут примерно на одном уровне рекомендательности (хм... это слово? , слишком лень спрашивать Лео) - что здесь определенно не так, один из них так задуман, а другой - быстрый и грязный хак, который является тупиком в любых контекстах, кроме самых тривиальных. - person kleopatra; 03.08.2013
comment
@kleopatra как дела? Пожалуйста, прочитайте этот комментарий Camick, как я понял, он не согласен с использованием toString(), насколько я понял этот комментарий, что вы думаете ? - person nachokk; 12.11.2013