Меню и панели инструментов |
285 |
setDefaultCloseOperation(EXIT_ON_CLOSE);
//первая панель инструментов
JToolBar toolbar1 = new JToolBar();
//добавим кнопки
toolbar1.add(new JButton(
new ImageIcon("images/New16.gif"))); toolbar1.add(new JButton(
new ImageIcon("images/Open16.gif")));
//разделитель
toolbar1.addSeparator();
//добавим команду toolbar1.add(new SaveAction());
//вторая панель инструментов
JToolBar toolbar2 = new JToolBar();
//добавим команду toolbar2.add(new SaveAction());
//раскрывающийся список toolbar2.add(new JComboBox(new String[] {
"Жирный", "Обычный" }));
//добавим панели инструментов в окно add(toolbar1, "North");
add(toolbar2, "South");
//выводим окно на экран
setSize(400, 300); setVisible(true);
}
// команда для панели инструментов
class SaveAction extends AbstractAction { public SaveAction() {
//настроим значок команды putValue(AbstractAction.SMALL_ICON,
new ImageIcon("images/Save16.gif"));
//текст подсказки putValue(AbstractAction.SHORT_DESCRIPTION,
"Сохранить документ...");
}
public void actionPerformed(ActionEvent e) { // ничего не делаем
}
}
public static void main(String[] args) { SwingUtilities.invokeLater(
286 |
ГЛАВА 10 |
new Runnable() {
public void run() { new SimpleToolbars(); } });
}
}
Мы создаем две панели инструментов, которые разместятся в небольшом окне JFrame. Сначала демонстрируется наиболее распространенный способ использования панели инструментов: создав компонент JToolBar, вы добавляете в него кнопки JButton, как правило, с небольшим значком. После двух кнопок мы добавляем разделитель, вызывая специальный метод addSeparator(). Внешний вид разделителя и его размеры зависят от задействованных внешнего вида и поведения, но вы можете повлиять на его размеры, вызвав перегруженную версию метода addSeparator() и передав в него объект Dimension, задающий размеры разделителя. В панели инструментов разделитель используется примерно так же, как в меню: для визуального отделения групп компонентов, выполняющих различные действия.
Третья кнопка добавляется не в виде компонента JButton, а как экземпляр команды Action, добавить команду позволяет специальная перегруженная версия метода add(). В главе 9 мы подробно рассмотрели команды Action и убедились в том, что во многих случаях они очень удобны, позволяя совмещать в одном месте настройку внешнего вида элемента управления и описание действия, которое он выполняет. Это особенно верно для панелей инструментов: в классе команды мы задаем значок и текст подсказки, и тут же можем описать действие, которое должна будет выполнить команда. После этого остается только добавить команду в панель инструментов. Если же вам понадобится модифицировать команду, будь это ее внешний вид или действие, вы знаете с чего начать — все скрыто в одном классе.
Вторая панель инструментов демонстрирует, что храниться в ней могут не только кнопки, но и любые другие компоненты. Сначала в панель добавляется команда, а затем раскрывающийся список JComboBox, созданный на основе массива строк. Раскрывающиеся списки довольно часто «гостят» в панелях инструментов, и не зря: они занимают немного места и позволяют организовать гибкий выбор одного варианта из многих.
Созданные нами панели инструментов добавляются в «пограничные» области окна, в котором по умолчанию используется полярное расположение BorderLayout. Первая панель размещается на севере, а вторая — на юге окна. Расположение BorderLayout специально создано для главных окон приложения с панелями инструментов. Запустив программу с примером, вы сможете оценить внешний вид панелей инструментов
JToolBar.
Меню и панели инструментов |
287 |
Обратите внимание на специальные полосы с левого края панели инструментов (так называемые вешки перемещения): с их помощью вы сможете перетаскивать (drag) панели инструментов, причаливая (dock) их к разным края окна, или же оставлять «плавающими». Интересно, что перетаскивать панели инструментов и причаливать их к краям окна можно, только если в нем используется расположение BorderLayout. Отсюда следует нехитрый совет: если в вашем окне есть панели инструментов, и вы хотите дать пользователю возможность их перетаскивать к другим краям окна, применяйте менеджер расположения BorderLayout, в противном случае пользователь может быть весьма озадачен тем, что панели инструментов оказываются совсем не там, куда он их перетаскивает.
Напоследок давайте составим небольшую таблицу свойств панелей инструментов JToolBar, позволяющих настраивать их поведение. Свойств в табл. 10.2 немного, и это неудивительно — панели инструментов очень просты и фактически представляют собой контейнер особого вида с некоторыми дополнительными возможностями.
Таблица 10.2. Основные свойства панелей инструментов
Свойство |
Описание |
orientation |
Задает направление панели инструментов: вертикальное или горизон- |
|
тальное (используемое по умолчанию). В заданном вами направлении |
|
в панель будут добавляться компоненты. Направление можно сменить |
|
и после создания панели инструментов |
floatable |
Управляет возможностью перетаскивания панели инструментов. По умол- |
|
чанию перетаскивание включено. Если перетаскивание не нужно или спо- |
|
собно запутать пользователя, задайте это свойство равным false |
rollover |
Включает эффект интерактивности — при наведении на компонент указа- |
|
теля мыши у компонента появляется специальная рамка или иной визу- |
|
альный эффект (к примеру, особый значок). По умолчанию эффект инте- |
|
рактивности отключен. Работает только для кнопок (наследников класса |
|
AbstractButton) |
borderPainted |
Управляет прорисовкой рамки панели инструментов. Наличие рамки зави- |
|
сит от внешнего вида и поведения, и по умолчанию рамка отображается. Как |
|
правило, это специальная полоса, с помощью которой пользователь может |
|
перетаскивать панель инструментов. Малополезное свойство, применимое |
|
разве что для достижения некоторых визуальных эффектов, когда стандарт- |
|
ная рамка не подходит |
Панели инструментов вызывают ожесточенные споры о том, какие же именно компоненты должны в них находиться, чтобы не запутывать пользователя. В нашем примере использована классическая схема — маленькие кнопки со значками и подсказками, но без текста. Однако такой дизайн хорош лишь для интуитивно понятных, привычных значков, таких как дискета для сохранения документа или лупа для поиска. Ознакомление пользователя с панелью инструментов пойдет гораздо лучше, если вы найдете на ней место для подписей на кнопках, а не станете заставлять вызывать всплывающую подсказку, чтобы понять, что же все-таки означает этот красивый значок.
Комбинирование панелей инструментов
Совсем не обязательно ограничиваться созданием простейших панелей инструментов, располагающихся у границы окна вашего приложения и состоящих из кнопок и некоторых других компонентов. Если вспомнить, что панель инструментов JToolBar — са-
288 |
ГЛАВА 10 |
мый обыкновенный компонент библиотеки Swing, и его можно добавлять в любые панели с любым подходящим менеджером расположения, то легко конструировать панели инструментов произвольной сложности, динамически добавлять и удалять их, составляя набор панелей из любого их количества.
Давайте рассмотрим пример. В этом примере настроим несколько панелей инструментов и расположим их вместе так, что пользователь будет видеть перед собой одну сложную, состоящую из нескольких частей, панель инструментов, которую при том легко будет расширять, перетаскивать по частям и настраивать:
//CombiningToolbars.java
//Создание комбинированных панелей
//инструментов
import javax.swing.*; import com.porty.swing.*; import java.awt.event.*; import java.awt.*;
public class CombiningToolbars extends JFrame { public CombiningToolbars() {
super("CombiningToolbars"); setDefaultCloseOperation(EXIT_ON_CLOSE);
//несколько панелей инструментов
JToolBar toolbar1 = new JToolBar(); toolbar1.add(new OpenAction()); toolbar1.add(new SaveAction()); toolbar1.addSeparator(); toolbar1.add(new JButton("Стиль")); JToolBar toolbar2 = new JToolBar(); toolbar2.add(new JButton("Формат"));
toolbar2.add(new JComboBox(new String[] { "Красный", "Зеленый"}));
JToolBar toolbar3 = new JToolBar(); toolbar3.add(new JButton("Обычный")); toolbar3.add(new JButton("Полужирный")); toolbar3.add(new JButton("Подчеркнутый"));
//выравнивание содержимого toolbar2.add(Box.createGlue());
//добавим две панели инструментов сюда
JPanel first = BoxLayoutUtils.createHorizontalPanel();
first.add(toolbar1); first.add(Box.createHorizontalStrut(5)); first.add(toolbar2);
//комбинируем полученные панели
Меню и панели инструментов |
289 |
JPanel all = BoxLayoutUtils.createVerticalPanel();
all.add(first); all.add(toolbar3);
//выравнивание содержимого
BoxLayoutUtils.setGroupAlignmentX( JComponent.LEFT_ALIGNMENT, first, toolbar3);
//добавим полученное на север окна
add(all, "North");
// выводим окно на экран setSize(400, 300); setVisible(true);
}
// несколько команд для панелей инструментов class OpenAction extends AbstractAction {
public OpenAction() {
// настроим значок команды putValue(AbstractAction.SMALL_ICON,
new ImageIcon("images/Open16.gif"));
}
public void actionPerformed(ActionEvent e) { // ничего не делаем
}
}
class SaveAction extends AbstractAction { public SaveAction() {
// настроим значок команды putValue(AbstractAction.SMALL_ICON,
new ImageIcon("images/Save16.gif"));
}
public void actionPerformed(ActionEvent e) { // ничего не делаем
}
}
public static void main(String[] args) { SwingUtilities.invokeLater(
new Runnable() {
public void run() { new CombiningToolbars(); } });
}
}