Чтобы ответить на заданный вами вопрос, существуют различные аспекты отключения определенного элемента в раскрывающемся списке JComboBox:
- ничего не делать, когда пользователь выбирает отключенный элемент
- сделать элемент видимым отключенным (например, серый текст вместо черного текста)
- сделать элемент вести себя отключенным (чтобы при его нажатии не исчезлораскрывающийся список)
Аспект # 1 на самом деле не является проблемой Swing, но будет решен в вашем коде обработки событий, и IMHO должно быть сделано, даже если # 3 были реализованы (даже если # 3Казалось бы, # 1 делает ненужным).
Аспект # 2 может быть реализован с помощью пользовательского ListCellRenderer для вашего JComboBox.Это не так сложно, как кажется, за исключением того, что в Интернете есть много примеров кода, которые делают это неправильно.Если вы новичок в этом, трудно понять, каким примерам кода доверять.(Тот же пользовательский ListCellRenderer также может заставить отключенный элемент не отображаться как оформленный, когда пользователь удерживает курсор над ним.)
Аспект № 3 сложен.Я не говорю, что это невозможно, но (если нет какого-то соответствующего API, о котором я не знаю), я бы не стал беспокоиться, потому что это заняло бы слишком много работы и даже тогда, вероятно, было бы слишком глупо.[edit: переопределение ComboBoxModel.setSelectedItem () ничего не делать, если его аргумент отключен, делает большую часть того, что вам нужно.Это не слишком глупо, но с помощью одного этого нажатия на отключенный элемент все равно будет закрываться всплывающее окно.]
Но если ответить на вопрос, который вы не задавали, действительно ли это лучший дизайн?Вы действительно хотите, чтобы пользователи видели раскрывающийся список параметров, включающий некоторые отключенные элементы, а не раскрывающийся список, содержащий только допустимые элементы?JComboBox предоставляет механизм, который можно использовать для настройки элементов в раскрывающемся списке непосредственно перед выпадающим раскрывающимся списком, который называется addPopupMenuListener ().Вы должны написать свой собственный PopupMenuListener и добавить или удалить элементы в его методе popupMenuWillBecomeVisible ().
Наконец, подумайте, как люди могут использовать ваш графический интерфейс.Допустим, в настоящее время поля со списком читаются 1 февраля, и пользователь хочет изменить его на 31 января. Вы хотите заставить пользователя сначала изменить месяц, а затем день?Или пользователь может сначала попытаться изменить день (что расстроит его / ее, потому что 31 будет либо отключен, либо отсутствует), а затем изменить месяц?Разумный план может состоять в том, чтобы позволить пользователю установить графический интерфейс на 31 февраля, но только в переходном режиме и просто не допустить перехода графического интерфейса на следующий шаг, если дата неверна.