260 ГЛАВА 9
for (String name : names) {
JCheckBox check = new JCheckBox(name); panel.add(check);
}
// добавляем все в контейнер add(ch);
add(panel);
// выводим окно на экран pack(); setVisible(true);
}
public static void main(String[] args) { SwingUtilities.invokeLater(
new Runnable() {
public void run() { new Checkboxes(); } });
}
}
Как видно, пример практически совпадает с примером переключателей, единственное отличие — мы не прибегли к логической группировке элементов управления. Все остальное, в том числе и расстояние между флажками, такое же. Применяйте флажки там, где пользователю нужно выбрать несколько возможных вариантов или что-то включить.
Дополнительные значки
Как вы помните, кнопки Swing позволяют практически полностью поменять свой внешний вид и настроить его под свой вкус. Мы подробно рассмотрели все свойства, связанные с этим, еще в самом первом примере этой главы. Однако, теперь, когда мы изучили и кнопки с двумя состояниями, возникает вопрос, как кнопки, если мы меняем их внешний вид и применяем значки, будут показывать выбранное состояние, к примеру, те же флажки? Есть ли возможность повлиять и на это? Конечно, есть, и управляется это еще одним свойством с названием selectedIcon. Используя его, вы можете задать значок, который будет рисоваться на экране в том случае, если элемент выбран, вместо флажка или переключателя. Ну а когда элемент не выбран, рисуется стандартный значок, который задается уже знакомым нам свойством icon.
Элементы управления |
261 |
Возможность на лету и с легкостью перестроить внешний вид компонентов Swing иногда захватывает, но все же следует пользоваться ей с осторожностью. В противном случае есть риск сделать код программы «грязноватым», слишком сильно перемешав настройку внешнего вида с деловой логикой. К тому же не стоит забывать о подключаемом внешнем виде и UI-представителях. Написать их не так уж и трудно, а результатом будет полное отделение логики программы от внешнего вида и поведения. Случай, когда внешний вид ваших компонентов основан на изображениях и значках, особенно хорошо сочетается с настраиваемым внешним видом Synth, стандартным для Swing и JDK.
Резюме
Благодаря элементам управления пользователь может немедленно изменить ход выполнения программы или что -либо выбрать. Позвольте ему это сделать: возможностей элементов управления Swing вам должно хватить на все случаи жизни.
Глава 10. Меню и панели инструментов
Система меню — важнейший элемент пользовательского интерфейса современных приложений. Именно в меню находится полный перечень команд приложения, который к тому же организован и разбит на группы. Благодаря этому ознакомление с возможностями приложения проходит быстрее, и начать работу, имея под рукой хорошо организованную и интуитивно понятную систему команд, гораздо проще. Так что можно смело утверждать, что процесс создания меню является одним из главных этапов на пути разработки хорошего приложения. Меню — это «лицо вашего приложения», и именно по нему пользователь составит первое впечатление о возможностях и качестве приложения.
К «авангарду» пользовательского интерфейса вашего приложения относятся и панели инструментов. Панель инструментов представляет собой компактный набор компонентов, чаще всего кнопок (хотя в ней могут содержаться любые компоненты), которые отвечают за наиболее важные и часто используемые функции вашего приложения. Панель инструментов позволяет пользователю совершать нужные действия гораздо быстрее, так что эффективность его работы с вашим приложением повышается, а это первейший фактор при создании пользовательских интерфейсов. Продуманные удобные панели инструментов наряду с удобной системой меню способны мгновенно сказать пользователю все о высоком качестве вашего приложения.
Меню
Хотя материал, посвященный меню, находится в отдельной главе, он вполне мог бы располагаться в главе 9, описывающей элементы управления. И это совсем не случайно. Ведь меню — это не что иное, как несколько кнопок, собранных в список и при необходимости вызываемых на экран. Данный факт не укрылся от разработчиков библиотеки Swing, и в результате элементы меню действительно оказались кнопками, унаследованными от хорошо знакомого нам класса AbstractButton, они отличаются от кнопок, флажков и переключателей только внешним видом да небольшими изменениями, позволяющими им находиться в меню. Поэтому, несмотря на то, что классы элементов меню имеют другие названия, никто не отнимет у вас знаний, полученных в предыдущих главах, — вы уже знаете, как изменять внешний вид элементов меню, назначать им мнемоники и обрабатывать события (хотя мы еще не видели ни одного примера). Чтобы ускорить процесс знакомства с системой меню библиотеки Swing, рассмотрим своеобразную таблицу соответствия уже рассмотренных нами элементов управления и элементов меню (табл. 10.1).
Таблица 10.1. Соответствие элементов управления и элементов меню
Элементы управления |
Элементы меню |
|
|
Кнопка JButton |
«Обычный» элемент меню JMenuItem |
Переключатель JRadioButton |
Элемент-переключатель JRadioButtonMenuItem |
Флажок JCheckBox |
Элемент-флажок JCheckBoxMenuItem |
|
|
Меню и панели инструментов |
263 |
Все, что рассказывалось относительно элементов управления, справедливо и для элементов меню. Вы можете заметить, что в системе меню нет эквивалента выключателя JToggleButton, и это не удивительно. При навигации по системе меню выбранный элемент меню становится «вжатым», а для выключателя такое поведение приведет к неоднозначному восприятию его состояния (в принципе, выключатель в меню и не нужен — с его функциями справляются флажки и переключатели).
Создание системы меню
Давайте рассмотрим пример, который разъяснит, как создается простейшая система меню, как она появляется на экране, и что для этого нужно сделать:
//MenuSystem.java
//Создание системы меню в Swing import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.*;
public class MenuSystem extends JFrame { public MenuSystem() {
super("MenuSystem"); setDefaultCloseOperation( EXIT_ON_CLOSE );
//создаем строку главного меню
JMenuBar menuBar = new JMenuBar();
//добавляем в нее выпадающие меню menuBar.add(createFileMenu()); menuBar.add(createWhoMenu());
//и устанавливаем ее в качестве
//меню нашего окна setJMenuBar(menuBar);
//выводим окно на экран setSize(300, 200); setVisible(true);
}
// создает меню "Файл"
private JMenu createFileMenu() {
//создадим выпадающее меню, которое будет
//содержать обычные пункты меню
JMenu file = new JMenu("Файл");
//пункт меню (со значком) JMenuItem open =
new JMenuItem("Открыть",
new ImageIcon("images/open16.gif"));
//пункт меню из команды
264 |
ГЛАВА 10 |
JMenuItem exit = new JMenuItem(new ExitAction());
//добавим все в меню
file.add(open);
//разделитель
file.addSeparator(); file.add(exit); return file;
}
// создадим забавное меню private JMenu createWhoMenu() {
// создадим выпадающее меню
JMenu who = new JMenu("Кто ВЫ ?");
//меню-флажки
JCheckBoxMenuItem clever =
new JCheckBoxMenuItem("Умный"); JCheckBoxMenuItem smart =
new JCheckBoxMenuItem("Красивый"); JCheckBoxMenuItem tender =
new JCheckBoxMenuItem("Нежный");
//меню-переключатели
JRadioButtonMenuItem male =
new JRadioButtonMenuItem("Мужчина"); JRadioButtonMenuItem female =
new JRadioButtonMenuItem("Женщина");
//организуем переключатели в логическую группу
ButtonGroup bg = new ButtonGroup(); bg.add(male); bg.add(female);
//добавим все в меню
who.add(clever);
who.add(smart);
who.add(tender);
// разделитель можно создать и явно who.add( new JSeparator()); who.add(male);
who.add(female); return who;
}
// команда выхода из приложения
class ExitAction extends AbstractAction { ExitAction() {
putValue(NAME, "Выход");