- •Окно jFrame
- •Панель содержимого
- •Класс Container (контейнер)
- •Класс jPanel (панель)
- •Менеджер последовательного размещения FlowLayout
- •Менеджер граничного размещения BorderLayout
- •Менеджер табличного размещения GridLayout
- •Менеджер блочного размещения BoxLayout и класс Box
- •Особенности выравнивания элементов
- •Ручное размещение элементов
- •Автоматическое определение размеров компонентов
- •«Упаковка» окна
- •Упражнение
- •Основные визуальные компоненты Swing Класс jComponent
- •Метка jLabel
- •Кнопка jButton
- •Компоненты jToggleButton, jCheckBox, jRadioButton
- •Упражнение
- •Текстовое поле jTextField
- •Поле для ввода пароля jPasswordField
- •Область для ввода текста jTextArea
- •Упражнение
- •Панель прокрутки jScrollPane
- •Инструментальная панель jToolBar
- •Выпадающий список jComboBox
- •Ползунок jSlider
- •Панель с вкладками jTabbedPane
- •Упражнение
- •Список jList
- •Окно входа в систему
- •Ход работы:
- •Контрольные вопросы:
Автоматическое определение размеров компонентов
Если у панели есть любой менеджер размещения, она игнорирует явно заданные размеры и координаты всех своих элементов. В этом легко убедиться, заменив в предыдущем примере команду panel.setLayout(null) на panel.setLayout(new FlowLayout()). Менеджер размещения сам определяет координаты и размеры всех элементов.
Способ определения координат элементов очевидным образом вытекает из алгоритмов работы каждого менеджера и, таким образом, детально рассмотрен нами выше.
Мы также отмечали, что в некоторых случаях компоненты стараются заполнить все доступное им пространство. Например, всю центральную область в случае менеджера BorderLayout или всю ячейку в менеджере GridLayout. А в панели с менеджером FlowLayout, напротив, элементы никогда не пытаются выйти за определенные границы. Рассмотрим, что это за границы.
Каждый визуальный компонент имеет три типа размеров: минимально допустимый, максимально допустимый и предпочтительный. Узнать, чему равны эти размеры для данного компонента можно с помощью соответствующих методов:
getMinimumSize(),
getPreferredSize(),
getMaximumSize().
Методы возвращают результат типа Dimension. Они запрограммированы в соответствующем классе. Например, у кнопки минимальный размер – нулевой, максимальный размер не ограничен, а предпочтительный зависит от надписи на кнопке (вычисляется как размер текста надписи плюс размеры полей).
Менеджер FlowLayout всегда устанавливает предпочтительные размеры элементов. Менеджер BorderLayout устанавливает предпочтительную ширину правого и левого, а также предпочтительную высоту верхнего и нижнего. Остальные размеры подгоняются под доступное пространство панели. Менеджер GridLayout пытается подогнать размеры всех элементов под размер ячеек. Менеджер BoxLayout ориентируется на предпочтительные размеры.
Когда элемент старается занять все доступное ему пространство, он «учитывает» пожелания не делаться меньше своих минимальных или больше максимальных.
Всеми тремя размерами можно управлять с помощью соответствующим методов set:
setMinimumSize(Dimension size),
setPreferredSize(Dimension size),
setMaximumSize(Dimension size).
Чаще всего используется простой прием, когда элементу «не рекомендуется» увеличиваться или уменьшаться относительно своих предпочтительных размеров. Это легко сделать командой:
element.setMinimumSize(element.getPreferredSize());
«Упаковка» окна
В рассмотренных выше примерах мы явно задавали размер окна методом setSize(). Но когда используется какой-либо менеджер расположения, расставляющий элементы и изменяющий их размеры по собственным правилам, трудно сказать заранее, какие размеры окна будут самыми подходящими.
Безусловно, наиболее подходящим будет вариант, при котором все элементы окна имеют предпочтительные размеры или близкие к ним.
Если вместо явного указания размеров окна, вызвать метод pack(), они будут подобраны оптимальным образом с учетом предпочтений всех элементов, размещенных в этом окне.
Оцените работу этого метода, заменив в каждом из вышеприведенных примеров команду
setSize(250, 100);
на команду
pack();
