Как создать переключатели в Java

Как создать переключатели в Java

В предыдущем примере пользователь мог установить оба флажка, один из них или ни одного. Во многих ситуациях необходимо выбрать только один из предложенных вариантов. Если пользователь установит другой флажок, то предыдущий флажок будет сброшен.

Такую группу флажков часто называют группой переключателей(radio button). Эти кнопки напоминают переключатели диапазонов на радиоприемниках — при нажатии на одной из таких кнопок ранее нажатая кнопка возвращается в исходное состояние.

На рис.1 показан типичный пример окна программы, содержащей группу переключателей. Пользователь может выбрать размер шрифта — Small(Малый), Medium(Средний), Large(Большой) и Extra large(Очень большой). Разумеется, выбрать можно лишь один размер.

Как создать переключатели в Java

Рис.1. Группа переключателей.

Пакет Swing позволяет легко реализовать группы переключателей. Для этого нужно создать для каждой группы по одному объекту ButtonGroup. Затем в группе переключателей необходимо добавить объекты типа JRadioButton. Объект класса ButtonGroup предназначен для того, чтобы отключать ранее выбранный переключатель, если пользователь щелкнул на новой кнопке.

Второй параметр конструктора принимает значение true, если изначально переключатель должен быть включен, и false — если выключен. Отметим, что объект типа ButtonGroup управляет лишь поведением переключателей. Если нужно объединить несколько групп переключателей, их следует поместить в контейнер, например объект класса JPanel.

Как создать флажки опций в JavaРис.2. Флажки опций

Смотрите на рис.1 и рис.2, обратите внимание что переключатели отличаются по внешнему виду от флажков опций. Флажки опций изображают в виде квадратов, причем для установленных флажков внутри имеется галочка, в то время как переключатели имеют круглую форму: включенные — с точкой внутри, а выключенные — без обозначений.

Механизм извещения о наступлении событий, связанных с переключателями, точно такой же, как и для любых других кнопок. Если пользователь включил переключатель, соответствующий объект генерирует событие. В рассматриваемом здесь примере установлен слушатель, задающий конкретный размер шрифта.

Сравните этот обработчик с обработчиком для флажка опций. Каждому переключателю соответствует свой объект-слушатель. Каждый объект-слушатель точно знает, что нужно делать — установить конкретный размер шрифта.

Для флажков ситуация иная. Оба флажка в нашем примере были связаны с одним и тем же слушателем. Он вызывал метод, определяющий текущее состояние обоих флажков.

Можно ли реализовать такой подход для переключателей? Зададим один слушатель, устанавливающий конкретный размер шрифта:

Однако предпочтительнее использовать отдельные объекты-слушатели поскольку они более явно связывают размер шрифта с конкретным переключателем.

В группе может быть выбран только один переключатель. Хорошо бы сразу знать, какой именно, не поверяя каждый переключатель в группе. Поскольку объект класса ButtonGroup управляет всеми переключателями, было бы удобно, если бы он давал нам ссылку на выбранный переключатель. Действительно, в классе ButtonGroup есть метод getSelection(), но этот метод не возвращает ссылку на выбранный переключатель.

Вместо этого он возвращает ссылку на объект класса ButtonModel — модель, связанную с этим переключателем. К сожалению, все методы класса ButtonModel не представляют собой ничего ценного. Интерфейс ButtonModel наследует метод getSelectedObjects() из интерфейса ItemSelectable, возвращающий совершенно бесполезную ссылку null.

Метод getActionCommand() выглядит предпочтительнее, поскольку позволяет определить текстовую строку, связанную с переключателем.

Однако команда в модели этого переключателя снова представляет собой нулевую ссылку null. Только если программист явно задаст команды для каждого переключателя с помощью метода setActionCommand(), установив значение, соответствующее каждой команде, впоследствии можно будет определить команду включенного переключателя с помощью метода buttonGroup.getSelection().getActionCommand().

Ниже представлен полный исходный код программы, позволяющий установить размер шрифта с помощью переключателей: