ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 167
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
3.2. Основные менеджеры компоновки Java
3.2.1. Принципы функционирования менеджеров компоновки
При добавлении компонентов в контейнер обычно не приходится указывать положение каждого компонента в пределах контейнера. С помощью менеджеров компоновки можно указать, как те или иные компоненты должны быть расположены по отношению к другим компонентам. Точные значения координат вычисляет сам менеджер. Таким образом, облегчается построение программ, не зависящих от используемого Web-браузера и разрешения дисплея.
Интерфейс LayoutManager является интерфейсом в библиотеке классов Java, описывающим как класс Container и менеджер компоновки взаимодействуют между собой. Он объявляет несколько методов, которые:
располагают контейнер в заданной панели – метод public void layoutContainer (Container parent);
информируют менеджер компоновки о добавлении и удалении компонентов из контейнера – методы public void addLayoutComponent(String name, Component comp) и public void removeLayoutComponent(Component comp);
задают размеры компонентов, которыми они управляют – методы public Dimension minimumLayoutSize(Container parent) и public Dimension preferredLayoutSize (Container parent).
Дополнительный интерфейс с методами позиционирования и проверки, LayoutManager2, был добавлен в JDK 1.1. В этом интерфейсе объявлен метод
public Dimension maximumLayoutSize(Container parent)
и методы, возвращающие выравнивание по осям x и y:
public float getLayoutAlignmentX(Container target)
public float getLayoutAlignmentY(Container target).
Кроме того, добавлен метод
public void addLayoutComponent(Component comp,
Object constraints),
добавляющий заданный компонент с использованием заданного объекта-ограничителя и метод
public void invalidateLayout (Container target),
делающий контейнер недействительным.
В AWT определены пять различных типов менеджеров компоновки:
-
FlowLayout – последовательное расположение; -
GridLayout – табличное расположение; -
BorderLayout – полярное расположение; -
CardLayout – блокнотное расположение; -
GridBagLayout – ячеистое расположение.
Все эти менеджеры реализуют интерфейс LayoutManager, а менеджеры BorderLayout, CardLayout и GridBagLayout – также интерфейс LayoutManager2. Установка менеджера компоновки для контейнера выполняется с помощью метода
public void setLayout(LayoutManager manager),
где параметр manager определяет объект одного из классов менеджеров компоновки, например:
setLayout(new GridLayout(3,2));
Метод
public LayoutManager getLayout()
возвращает менеджер компоновки для данного контейнера.
Для определения промежутков между границей контейнера и содержащихся в нем компонент используется класс Insets. В данном классе содержатся свойства
public int top,
public int left,
public int bottom,
public int right,
задающие отступ сверху, справа, снизу и слева (в пикселях). Менеджер компоновки создает объект класса Insets, обратившись к конструктору класса
public Insets(int top, int left, int bottom, int right),
который возвращает объект Insets. Параметры top, left, bottom и right определяют промежутки (в пикселях) соответственно от верхней, левой, нижней и правой границ контейнера. Например, если требуется оставить пространство шириной 20 пикселей снизу и сверху и 10 пикселей по бокам, нужно определить в программе следующий метод insets():
public Insets insets()
{
return new Insets (20, 10, 20, 10);
}
Для выполнения своей работы менеджер компоновки должен связываться с объектом класса Container. Если контейнер не имеет связанного с ним менеджера компоновки, он просто помещает компоненты с использованием методов класса
Component
public void setBounds(Rectangle r),
передвигающим и изменяющим размеры компонента так, чтобы он вписывался в заданный прямоугольник,
public void setLocation(Point p),
перемещающим компонент или
public void setSize(Dimension d),
изменяющим размеры компонента.
Если контейнер имеет связанный с ним менеджер компоновки, контейнер запрашивает менеджер компоновки о позиционировании и размерах своих компонент перед тем, как они будут нарисованы. Сам менеджер компоновки не выполняет рисования, он просто решает, какой размер и позицию должен иметь каждый компонент и вызывает методы setBounds(), setLocation() и/или setSize() для каждого из этих компонентов.
Как уже указывалось выше, LayoutManager связан с объектом класса Container вызовом метода setLayout(), например:
Panel p = new Panel();
p.setLayout(new BorderLayout());
Некоторые контейнеры, такие как Panel, обеспечивает конструктор, который в качестве аргумента воспринимает менеджер компоновки:
Panel p = new Panel(new BorderLayout());
При создании собственных менеджеров компоновки также должен быть реализован интерфейс LayoutManager и, возможно, LayoutManager2.
Собственные менеджеры расположения обычно используются в тех случаях, когда возможности, предоставляемые стандартными менеджерами, являются недостаточными.
В тех случаях, когда требуется вручную расположить компоненты, используется абсолютное позиционирование компонент. Поскольку даже когда менеджер компоновки не задан, действует менеджер по умолчанию (FlowLayout для Panel и BorderLayout для Frame), необходимо отключить менеджеры компоновки, действующие по умолчанию, с помощью оператора
setLayout(null);
3.2.2. Менеджер FlowLayout
Класс FlowLayout рассматривает как контейнер набор строк. Этот менеджер используется по умолчанию в объектах классов Panel и Applet.
Это самый простой из менеджеров компоновки AWT. Его стратегия компоновки являются следующей:
учитывать предпочитаемый размер всех содержащихся компонент.
скомпоновать как можно больше компонент горизонтально внутри контейнера.
начать новую строку компонент, если они еще есть.
если все компоненты не соответствуют размерам, то, компоненты, которые не помещаются, не выводятся.
Высота каждой строки определяется по высоте находящихся в ней компонентов. Менеджер FlowLayout добавляет компоненты слева направо. Если следующий компонент не помещается в текущей строке, происходит переход на новую строку, которая опять начинается слева. Можно размещать строки с выравниванием влево, вправо и по центру. По умолчанию используется выравнивание по центру.
Конструктор
public FlowLayout(int alignment, int hgap, int vgap)
создает объект FlowLayout. Параметр alignment регулирует выравнивание строк, а возможные типы выравнивания задаются следующими переменными класса FlowLayout с модификаторами public static final int: LEFT (влево), RIGHT (вправо) и CENTER (по центру). Параметры hgap и vgap задают размеры промежутков между компонентами по вертикали и горизонтали (в пикселях). Так, чтобы расположить компоненты с правым выравниванием с промежутком 10 пикселей по вертикали и 5 пикселей по горизонтали, надо создать объект FlowLayout следующим образом:
myFlowLayout = new FlowLayout(FlowLayout.RIGHT, 10, 5);
Можно также использовать конструкторы
public FlowLayout(int alignment)
и
public FlowLayout()
(по умолчанию hgap и vgap равны 5 пикселей и выравнивание производится по центру).
Предпочтительным для FlowLayout будет размещение всех его компонент в одном ряду. Это означает, что его предпочтительная высота должна быть максимальной высотой компонент плюс промежуток, равный vgap. Предпочтительная ширина должна быть суммой всех значений ширины содержащихся компонент плюс расстояния между компонентами плюс расстояния между компонентом и границами ряда, равные
hgap (vgap и hgap являются общими свойствами большинства стандартных менеджеров компоновки и определяют, как далеко компоненты размещаются друг от друга).
Класс FlowLayout, помимо методов интерфейса LayoutManager, обеспечивает также следующие методы:
public int getAlignment() и public void setAlignment(int align) – получение и установка выравнивания;
public int getVgap() и public void setVgap(int vgap) – получение и установка промежутка по вертикали между компонентами;
public int getHgap() и public void setHgap(int hgap) – получение и установка промежутка по горизонтали между компонентами.
Менеджер FlowLayout ориентирован по горизонтали. Если необходима вертикальная компоновка, нужно написать свой собственный менеджер (или использовать менеджер BoxLayout из библиотеки Swing).
3.2.3. Менеджер GridLayout
Класс GridLayout разделяет контейнер на клетки одинакового размера (по типу таблицы). При добавлении компонентов в контейнер GridLayout конструктор
public GridLayout(int rows, int cols, int hgap, int vgap)
размещает их в клетках слева направо и сверху вниз. Параметры rows и cols задают количество строк или столбцов таблицы, hgap а и vgap – соответственно промежутки между столбцами и строками. Если задано количество строк, количество столбцов будет вычислено. Если, наоборот, задать количество столбцов, вычисляться будет количество строк. Если добавить шесть компонентов в объект