Менеджер размещения 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 своеобразен — он показывает в контейнере только один, первый (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, в отличие от других менеджеров размещения, не содержит правил размещения. Он играет только организующую роль. Ему передаются ссылка на компонент и правила расположения этого компонента, а сам он помещает данный компонент по указанным правилам в контейнер. Все правила размещения компонентов задаются в объекте другого класса, 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, с); // Помещаем в контейнер
и т.д.
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):