в последнее время я столкнулся с проблемой, когда у меня есть 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?
Средство рендеринга по умолчанию использует метод 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
Вам нужно создать собственный рендерер, чтобы отобразить соответствующее свойство из вашего класса. Однако пользовательский рендеринг является лишь половиной решения, так как вы нарушаете функциональные возможности по умолчанию в поле со списком, чтобы выбрать элемент с помощью клавиатуры.
См. Combo Box с Custom Renderer для реализации, которая выполняет рендеринг и по-прежнему позволяет выбирать клавиатуру и элемент в поле со списком.