□ short_description — краткое описание действия для всплывающей подсказки;
□ small_icon — имя изображения на инструментальной кнопке.
Поля определяются, например, так:
act.putValue(Action.SMALL ICON, new ImageIcon("save.gif"));
и используются потом так:
ImageIcon ic = (Imagelcon)act.getValue(Action.SMALL ICON);
Объект, реализующий интерфейс Action, может быть доступен (enabled) или недоступен (disabled). Это регулируется методом setEnabled(boolean). Например, при создании текстового редактора команды Вырезать, Копировать следует сделать недоступными, пока не выделен текст в окне редактирования.
Интерфейс Action частично реализован абстрактным классом AbstractAction, в котором не определен только метод actionPerformed(ActionEvent). Достаточно расширить класс AbstractAction, определив этот метод, и можно использовать его возможности.
Некоторые контейнеры, в число которых входят JMenu, JPopupMenu и JToolBar, умеют использовать объекты, реализующие интерфейс Action. Достаточно обратиться к методу add (Action act) такого контейнера, и он создаст соответствующий компонент со свойствами, определенными в объекте act.
Например, метод tb.add(act) панели инструментов tb класса JToolBar создаст инструментальную кнопку класса JButton с изображением, командной клавишей, всплывающей подсказкой и прочими свойствами инструментальной кнопки, содержащимися в объекте act. Метод m.add(act) меню m класса JMenu с тем же объектом act создаст пункт меню класса JMenultem с надписью, ярлычком, всплывающей подсказкой, взятыми у того же объекта act.
Контейнер автоматически присоединит к созданному компоненту обработчик события
ActionEvent, описанный в методе actionPerformed (ActionEvent). Кроме того, контейнер будет автоматически отслеживать изменения в самом объекте типа Action и приводить созданный компонент в соответствие с этими изменениями.
Классы, реализующие интерфейс Action, очень удобно использовать в тех случаях, когда одно и то же действие выполняется несколькими элементами графического интерфейса. Например, сохранение файла может быть вызвано пунктом меню Сохранить, инструментальной кнопкой с изображением дискеты или из всплывающего контекстного меню. В любом случае сохранение файла выполняет один объект типа Action, присоединенный к этим графическим элементам их методом add(Action) .
Метод add(Component comp, Object constraints) класса Container переопределен в классе JLayeredPane так, что второй параметр задает слой, в который помещается компонент. Например, компонент comp можно поместить в слой с номером 50 методом add(comp, new Integer(50)).
Шесть слоев обозначены статическими константами типа Integer. Они интенсивно используются методами самой библиотеки Swing.
□ frame_content_layer — слой с номером Integer(-30000). Такой маленький номер гарантирует, что этот слой окажется ниже всех слоев. Данный слой используется классом JRootPane для размещения компонентов и строки меню.
□ default_layer — слой с номером Integer(0). Стандартная панель для размещения компонентов.
□ palette_layer — слой с номером Integer(i00). В нем обычно располагаются плавающие панели инструментальных кнопок и палитры.
□ modal_layer — слой с номером Integer(200). Здесь располагаются модальные диалоговые окна.
□ popup_layer — слой с номером Integer (300). Сюда помещают окна, всплывающие над модальными диалоговыми окнами.
□ drag_layer — слой с номером Integer(400). Сюда переводится компонент на время его перетаскивания с помощью мыши. После перетаскивания и отпускания кнопки мыши компонент погружается в свой слой.
Слоеная панель не управляется никаким менеджером размещения, размеры и положение компонентов на ней следует задавать унаследованным методом
setBounds(int x, int y, int width, int height);
или парой методов
setLocation(int x, int y); setSize(int width, int height);
Класс JLayeredPane расширяет класс JComponent и является компонентом Swing. Каждый слой ведет себя как обычный контейнер класса Container, но компоненты в нем могут перекрываться, причем компонент с меньшим номером перекрывает компонент с большим номером, но компонент с номером -1 лежит под всеми другими компонентами этого слоя.
Компоненты можно перемещать в своем слое методами:
□ moveToFront (Component comp) переместить компонент comp в позицию с номером 0;
□ moveToBack(Component comp) переместить компонент comp в позицию с номером -1;
□ setPosition(Component comp, int ind) — переместить компонент comp в позицию ind.