Смекни!
smekni.com

Программирование графики и обработка событий (стр. 3 из 4)

Менеджер GridLayout

Менеджер размещения GridLayout расставляет компоненты в таблицу с заданным в конструкторе числом строк rows и столбцов columns:

GridLayout(int rows, int columns)

Все компоненты получают одинаковый размер. Промежутков между компонентами нет. Второй конструктор позволяет задать промежутки между компонентами в пикселах по горизонтали hgap и вертикали vgap:

GridLayout(int rows, int columns, int hgap, int vgap)

Конструктор по умолчанию GridLayout() задает таблицу размером 0x0 без промежутков между компонентами. Компоненты будут располагаться в одной строке.

Компоненты размещаются менеджером GridLayout слева направо по строкам созданной таблицы в том порядке, в котором они заданы в методах add().

Нулевое количество строк или столбцов означает, что менеджер сам создаст нужное их число.

Рис. 3. Пример размещения кнопок менеджером GridLayout

Менеджер CardLayout

Менеджер размещения CardLayout своеобразен — он показывает в контейнере только один, первый (first), компонент. Остальные компоненты лежат под первым в определенном порядке как игральные карты в колоде. Их расположение определяется порядком, в котором написаны методы add(). Следующий компонент можно показать методом next(Container с), предыдущий — методом previous(Container с), Последний — методом last(Container с), первый — методом first(Container с). Аргумент этих методов — ссылка на контейнер, в который помещены компоненты, обычно this.

В классе два конструктора:

· СardLayout() — не отделяет компонент от границ контейнера;

· CardLayout(int hgap, int vgap) — задает горизонтальные hgap и вертикальные vgap поля.

Менеджер CardLayout позволяет организовать и произвольный доступ к компонентам. Метод add() для менеджера CardLayout имеет своеобразный вид:

add(Component comp, Object constraints)

Здесь аргумент constraints должен иметь тип String и содержать имя компонента. Нужный компонент с именем name можно показать методом:

show(Container parent, String name)

Рис. 4. Пример менеджера размещения CardLayout

Менеджер GridBagLayout

Менеджер размещения GridBagLayout расставляет компоненты наиболее гибко, позволяя задавать размеры и положение каждого компонента. Но он оказался очень сложным и применяется редко.

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

Менеджер размещает компоненты в таблице с неопределенным заранее числом строк и столбцов. Один компонент может занимать несколько ячеек этой таблицы, заполнять ячейку целиком, располагаться в ее центре, углу или прижиматься к краю ячейки.

Класс GridBagConstraints содержит одиннадцать полей, определяющих размеры компонентов, их положение в контейнере и взаимное положение, и несколько констант — значений некоторых полей. Они перечислены в табл. 1. Эти параметры определяются конструктором, имеющим одиннадцать аргументов. Второй конструктор — конструктор по умолчанию — присваивает параметрам значения, заданные по умолчанию.

Таблица 1. Поля класса GridBagConstraints

Поле Значение
anchor Направление размещения компонента в контейнере. Константы: CENTER, NORTH, EAST, NORTHEAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, и NORTHWEST; no умолчанию CENTER
fill Растяжение компонента для заполнения ячейки. Константы: NONE, HORIZONTAL, VERTICAL, BOTH; ПОумолчаниюNONE
gridheight Количество ячеек в колонке, занимаемых компонентом. Целое типа int, по умолчанию 1. Константа REMAINDER означает, что компонент займет остаток колонки, RELATIVE — будет следующим по порядку в колонке
gridwidth Количество ячеек в строке, занимаемых компонентом. Целое типа int, по умолчанию 1. Константа REMAINDER означает, что компонент займет остаток строки, RELATIVE — будет следующим в строке по порядку
gridx Номер ячейки в строке. Самая левая ячейка имеет номер 0. По умолчанию константа RELATIVE, что означает: следующая по порядку
gridy Номер ячейки в столбце. Самая верхняя ячейка имеет номер 0. По умолчанию константа RELATIVE, что означает: следующая по порядку
insets Поля в контейнере. Объект класса insets; по умолчанию объект с нулями
ipadx, ipady Горизонтальные и вертикальные поля вокруг компонентов; по умолчанию 0
weightx,weighty Пропорциональное растяжение компонентов при изменении размера контейнера; по умолчанию 0,0

Как правило, объект класса GridBagConstraints создается конструктором по умолчанию, затем значения нужных полей меняются простым присваиванием новых значений, например:

GridBagConstraints gbc = new GridBagConstraints();

gbc.weightx = 1.0;

gbc.gridwidth = GridBagConstraints.REMAINDER;

gbc.gridheight =2;

После создания объекта gbc класса GridBagConstraints менеджеру размещения указывается, что при помещении компонента comp в контейнер следует применять правила, занесенные в объект gbc. Для этого применяется метод

add(Component comp, GridBagConstraints gbc)

Итак, схема применения менеджера GridBagLayout такова:

GridBagLayout gbl = new GridBagLayout(); // Создаем менеджер

setLayout(gbl); // Устанавливаем его в контейнер

// Задаем правила размещения по умолчанию

GridBagConstraints с = new GridBagConstraints();

Button b2 = new Button(); // Создаемкомпонент

c.gridwidth =2; // Меняем правила размещения

add(bl, с); // Помещаем компонент b2 в контейнерпо указанным правилам

//размещения с

Button b2 = new Button(); // Создаем следующий компонент

c.gridwidth = 1; // Меняем правила для его размещения

add(b2, с); // Помещаем в контейнер

и т.д.

Приложение 5. Обработка событий.

Java 2 использует хорошо структурированную, функционально полную и очень логичную модель обработки событий, впервые реализованную в JDK 1.1. Иерархия классов событий имеет вид:

 Object

 EventObject

 AWTEvent

 ActionEvent

 AdjustmentEvent

 ItemEvent

TextEvent

ComponentEvent

ContainerEvent

FocusEvent

WindowEvent

PaintEvent

 InputEvent

 KeyEvent

 MouseEvent

Классы и интерфейсы для работы с делегированными событиями расположены в пакете java.awt.event (см. рисунок 5).


В классах событий существуют открытые методы:

Класс Метод Возвращаемые данные
EventObject Object getSource() объект, вызвавший события
String toString() строка, описывающая событие
AWTEvent int getID() идентификатор типа события
String paramString() строка параметров события
ActionEvent int getModifiers() состояние клавиш-модификаторов
String getActionCommand() название действия
AdjustmеntEvent int getValue() текущее значение, полученное из прокрутки
int getAdjustmentType() тип установки прокрутки, изменившей значения
Adjustable getAdjustable() ссылка на объект прокрутки, установивший значение
ItemEvent Object getItem() пункт списка, измененный данным событием
Container getContainer() объект, вызвавший данное событие
FocusEvent boolean isTemporary() истину, если фокус ввода данного объекта возобновляется самостоятельно
PaintEvent Graphics getGraphics() графический контекст для данного события
WindowEvent Window getWindow() ссылка на окно, которое вызвало данное событие
InputEvent boolean isShiftDown() истина, если нажата клавиша Shift
boolean isControlDown() истина, если нажата клавиша Control
boolean isMetaDown() истина, если нажата клавиша Meta
boolean isAltDown() истина, если нажата клавиша Alt
int getWhen() время в миллисекундах с того времени, как произошло данное событие
int getModifiers() состояние всех модификаторов клавиатуры
boolean isConsumed() истина, если событие обработано
KeyEvent int getKeyCode() код клавиши, вызвавшей событие
char getKeyChar() символ клавиши, вызвавшей событие
boolean isActionKey() истина, если клавиша, вызвавшая событие, является функциональной клавишей
MouseEvent int getX() текущая абсцисса указателя мыши при генерации данного события
int getY() текущая ордината указателя мыши при генерации данного события
Point getPoint() положение указателя мыши при генерации данного события
getClickCount() число нажатий на кнопку мыши при генерации данного события
isPopupTrigger() истина, если данное событие связано с переключателем всплывающего меню для текущей операционной платформы

Классы, ответственные за обработку событий в JDK 1.1, реализуют интерфейсы “прослушивания” событий (listeners):