Я хочу изменить отображение (не редактируемого) JComboBox
таким образом, чтобы текущая выбранная запись имела дополнительный текст в поле редактирования (хотя не в раскрывающемся списке) .
Примерно так:
Моим первым предположением было переопределить модель ComboBox, чтобы getSelectedItem
возвращал объект-оболочку, модифицирующий отображение:
petList.setModel(new ComboBoxModel() {
private Object selected;
public void setSelectedItem(Object anItem) {
selected = anItem;
}
public Object getSelectedItem() {
return new ActiveComboItem(selected);
}
// … The rest of the methods are straightforward.
});
Где ActiveComboItem
выглядит следующим образом:
static class ActiveComboItem {
private final Object item;
public ActiveComboItem(Object item) { this.item = item; }
@Override
public boolean equals(Object other) {
return item == null ? other == null : item.equals(other);
}
@Override
public String toString() { return String.format("Animal: %s", item); }
}
Действительно, это работает, когда идет изменение дисплея. К сожалению, текущая запись больше не помечается как активная:
(Обратите внимание на отсутствующий флажок ... или, тем не менее, выбор отображается вашей ОС.)
Дальнейшая проверка показывает, что метод getElementAt
модели вызывается с индексом -1
каждый раз, когда пользователь выбирает новый элемент в поле. Это только случай, когда используется измененный выбранный элемент. Когда метод getSelectedItem
модели возвращает простой объект без оболочки, выбранный элемент помечается как выбранный в раскрывающемся списке, и getElementAt
- это , а не , вызываемый с аргументом -1
.
Очевидно, ComboBox сравнивает каждый элемент по очереди с текущим активным элементом, но, несмотря на мое переопределение метода equals
, не находит соответствия. Как я могу это исправить?
(Полный скомпилированный код для этой проблемы на gist.github.com )