Значения JComboBox из объектного массива

1

в последнее время я столкнулся с проблемой, когда у меня есть ArrayList, заполненный объектами

ArrayList<Item> allItems;

в то время как каждый из объектов Item имеет свои собственные атрибуты, такие как String name или int value. В моем графическом интерфейсе я хочу, чтобы JComboBox заполнялся только с именем значения каждого объекта Item в allItems ArrayList. Объекты внутри allItems добавляются во время выполнения моей программы и не имеют значений в начале. После того, как я добавлю новый элемент в свой ArrayList, я вызываю

comboBox.setModel(new javax.swing.DefaultComboBoxModel(allItems.toArray()));

но это только дает мне что-то вроде items.Item@283ae01 например. Возможно ли отображать только значения String name каждого элемента из ArrayList в ComboBox?

Теги:
arraylist

2 ответа

0

Средство рендеринга по умолчанию использует метод toString объектов в списке для рендеринга элементов. Вы можете либо a) переопределить метод toString класса, добавленного в JComboBox, чтобы обеспечить правильное отображение имени

@Override
public String toString(){
    return name;
}

или b) предоставить пользовательский рендерер для JComboBox, который настраивает компонент, используемый для рендеринга элементов в JComboBox

ListCellRenderer renderer = new DefaultListCellRenderer(){
    @Override
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
        Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
        if ( value == null ){
            return c;
        }
        if ( c instanceof JLabel ){
            JLabel label = (JLabel)c;
            Test t = (Test)value;
            label.setText(t.getName());
        }
        return c;
    }
};
myComboBox.setRenderer(renderer);

Обратите внимание, что приведенный выше синтаксис pre-java 7. В java 7 и выше эти классы параметризуются с использованием дженериков.

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

Существуют и другие примеры этого и более в java-учебнике по использованию JComboBoxes

0

Вам нужно создать собственный рендерер, чтобы отобразить соответствующее свойство из вашего класса. Однако пользовательский рендеринг является лишь половиной решения, так как вы нарушаете функциональные возможности по умолчанию в поле со списком, чтобы выбрать элемент с помощью клавиатуры.

См. Combo Box с Custom Renderer для реализации, которая выполняет рендеринг и по-прежнему позволяет выбирать клавиатуру и элемент в поле со списком.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню