Почему getSelectedItem() не является общим для JComboBox?

JCombobox в Java 7 был обновлен для использования дженериков — я всегда думал, что это было немного недосмотром, потому что это еще не сделано, поэтому я был рад увидеть это изменение.

Однако при попытке использовать JCombobox таким образом я понял, что методы, которые, как я ожидал, будут использовать эти общие типы по-прежнему просто возвращает Object.

Почему это так? Мне это кажется глупым дизайнерским решением. Я понимаю, что базовая ListModel имеет общий getElementAt() метод, поэтому я буду использовать его вместо этого, но это немного окольный способ сделать что-то, что выглядит так, как будто это могло быть изменено в самом JComboBox.


person Michael Berry    schedule 11.08.2011    source источник
comment
возможно, forums.oracle.com/forums/ +1 за Java7   -  person mKorbel    schedule 11.08.2011
comment
@mKorbel Возможно, я что-то упустил, но какая часть темы объясняет это?   -  person Michael Berry    schedule 11.08.2011


Ответы (2)


Я полагаю, вы имеете в виду getSelectedItem()?

Причина в том, что если поле со списком является редактируемым, выбранный элемент не обязательно содержится в базовой модели и не ограничивается универсальным типом. Например. если у вас есть редактируемый JComboBox<Integer> с моделью [1, 2, 3], вы все равно можете ввести «foo» в компоненте, и getSelectedItem() вернет строку «foo», а не объект типа Integer.

Если поле со списком недоступно для редактирования, вы всегда можете отложить до cb.getItemAt(cb.getSelectedIndex()) для обеспечения безопасности типов. Если ничего не выбрано, это вернет null, что является тем же поведением, что и getSelectedItem().

person jarnbjo    schedule 11.08.2011
comment
Ах, это имеет большой смысл - после потери памяти я забыл о редактируемой стороне JComboBoxes. Скорее всего потому, что ни один из них не редактируется в моем приложении! Метод, который вы описываете, - это то, что я использовал вместо этого - это казалось окольным способом, но теперь я понимаю, почему. - person Michael Berry; 11.08.2011
comment
Вам не нужно быть уверенным, что элемент выбран. Если getItemAt присвоено недопустимое значение (например, -1), возвращается null. Это то же поведение, что и getSelectedItem(), если ничего не выбрано. - person Duncan Jones; 23.04.2013
comment
@DuncanJones: Вы правы. Без проверки я предположил, что getItemAt вызовет исключение IllegalArgumentException, IndexArrayOutOfBoundsException или что-то подобное, если будет вызван с недопустимым индексом. - person jarnbjo; 24.04.2013
comment
@jarnbjo Это определенно необычное поведение. Я бы добавил комментарий к своему коду, если бы когда-либо полагался на него. - person Duncan Jones; 24.04.2013
comment
Если бы у меня было редактируемое поле со списком, которое я хотел ограничить значением ‹Целое число›, я думаю, что было бы разумно ожидать, что я могу ввести пользовательское значение только в том случае, если оно является допустимым целым числом. Поэтому я бы предпочел, чтобы они дали нам какой-то интерфейс конвертера для преобразования строки в типы в поле со списком и обратно. Но по какой-то причине тот, кто разработал API, не любил безопасность типов. Они также не обновили JFormattedTextField. - person Trejkaz; 04.10.2016

Вот типобезопасная версия:

public static <T> T getSelectedItem(JComboBox<T> comboBox)
{
    int index = comboBox.getSelectedIndex();
    return comboBox.getItemAt(index);
}
person BullyWiiPlaza    schedule 03.12.2017