Как отключить элементы из поля со списком? - PullRequest
0 голосов
/ 28 декабря 2018

Как я могу отключить предметы из свингового поля со списком?Я добавил элементы в виде кода, так как в моем проекте мы не можем добавить их вручную из дизайна.Я хочу отключить элементы, например, если апрель выбран в поле со списком "Месяц колебания", элемент 31 также следует отключить с помощью предупреждающего сообщения, поскольку в месяце апреля 30 дней, а не 31 день.

public void months()

{

   cmbDay.addItem("1");
   cmbDay.addItem("2");
   cmbDay.addItem("3");
   cmbDay.addItem("4");
   cmbDay.addItem("5");
   cmbDay.addItem("6");
   cmbDay.addItem("7");
   cmbDay.addItem("8");
   cmbDay.addItem("9");
   cmbDay.addItem("10");
   cmbDay.addItem("11");
   cmbDay.addItem("12");
   cmbDay.addItem("13");
   cmbDay.addItem("14");
   cmbDay.addItem("15");
   cmbDay.addItem("16");
   cmbDay.addItem("17");
   cmbDay.addItem("18");
   cmbDay.addItem("19");
   cmbDay.addItem("20");
   cmbDay.addItem("21");
   cmbDay.addItem("22");
   cmbDay.addItem("23");
   cmbDay.addItem("24");
   cmbDay.addItem("25");
   cmbDay.addItem("26");
   cmbDay.addItem("27");
   cmbDay.addItem("28");
   cmbDay.addItem("29");
   cmbDay.addItem("30");
   cmbDay.addItem("31");




   String getMonths = String.valueOf(cmbMonth.getSelectedItem());

  if (cmbMonth.getSelectedItem().equals("April"))
   {



   }

   else if (cmbMonth.getSelectedItem().equals("June"))
   {



   }
   else if (cmbMonth.getSelectedItem().equals("September"))
   {



   }
   else if (cmbMonth.getSelectedItem().equals("November"))
   {



   }
  }

1 Ответ

0 голосов
/ 28 декабря 2018

Чтобы ответить на заданный вами вопрос, существуют различные аспекты отключения определенного элемента в раскрывающемся списке JComboBox:

  1. ничего не делать, когда пользователь выбирает отключенный элемент
  2. сделать элемент видимым отключенным (например, серый текст вместо черного текста)
  3. сделать элемент вести себя отключенным (чтобы при его нажатии не исчезлораскрывающийся список)

Аспект # 1 на самом деле не является проблемой Swing, но будет решен в вашем коде обработки событий, и IMHO должно быть сделано, даже если # 3 были реализованы (даже если # 3Казалось бы, # 1 делает ненужным).

Аспект # 2 может быть реализован с помощью пользовательского ListCellRenderer для вашего JComboBox.Это не так сложно, как кажется, за исключением того, что в Интернете есть много примеров кода, которые делают это неправильно.Если вы новичок в этом, трудно понять, каким примерам кода доверять.(Тот же пользовательский ListCellRenderer также может заставить отключенный элемент не отображаться как оформленный, когда пользователь удерживает курсор над ним.)

Аспект № 3 сложен.Я не говорю, что это невозможно, но (если нет какого-то соответствующего API, о котором я не знаю), я бы не стал беспокоиться, потому что это заняло бы слишком много работы и даже тогда, вероятно, было бы слишком глупо.[edit: переопределение ComboBoxModel.setSelectedItem () ничего не делать, если его аргумент отключен, делает большую часть того, что вам нужно.Это не слишком глупо, но с помощью одного этого нажатия на отключенный элемент все равно будет закрываться всплывающее окно.]

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

Наконец, подумайте, как люди могут использовать ваш графический интерфейс.Допустим, в настоящее время поля со списком читаются 1 февраля, и пользователь хочет изменить его на 31 января. Вы хотите заставить пользователя сначала изменить месяц, а затем день?Или пользователь может сначала попытаться изменить день (что расстроит его / ее, потому что 31 будет либо отключен, либо отсутствует), а затем изменить месяц?Разумный план может состоять в том, чтобы позволить пользователю установить графический интерфейс на 31 февраля, но только в переходном режиме и просто не допустить перехода графического интерфейса на следующий шаг, если дата неверна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...