Менеджеры размещения компонентов



 

Способ размещения компонентов в контейнере зависит от менеджера компоновки, ассоциированного с этим контейнером. С помощью этих менеджеров можно легко и быстро обеспечить необходимое расположение компонентов относительно друг друга и включающего их контейнера. Этот механизм позволяет с легкостью решать такие задачи, как, например, динамическое изменение расположения компонентов в зависимости от меняющейся величины окна. JDK содержит несколько готовых менеджеров размещения, которые пригодны для построения интерфейсов в большинстве апплетов.

Типы менеджеров размещения. К простейшим менеджерам относятся FlowLayout и GridLayout, к более сложным - BorderLayout, CardLayout и GridBagLayout. Для изменения типа менеджера размещения в контейнере используется метод setLayout() класса контейнеров (предварительно необходимо создать объект нового менеджера размещения). Для получения ссылки на используемый в контейнере менеджер размещения существует метод контейнера getLayout().

В классы всех менеджеров размещения входят методы для обеспечения размещения компонент. Метод layoutContainer() предназначен для того, чтобы компоненты могли установить для себя предпочтительный размер. Определение минимального размера окна контейнера (с учетом остальных компонент в родительском контейнере), необходимого для размещения всех компонент производится методом minimumLayoutSize(). Для определения предпочтительного размера окна контейнера (с учетом остальных компонент в родительском контейнере), необходимого для размещения всех компонент служит метод prefferedLayoutSize().

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

Менеджер FlowLayout поддерживает три типа выравнивания: влево, вправо и по центру (режим по умолчанию). Тип выравнивания, а также величину отступов между компонентами по вертикали и горизонтали можно задать в конструкторе при создании объекта FlowLayout.

 

Менеджер размещения GridLayout.При помощи менеджера GridLayout можно точно указать, где именно разместить тот или иной компонент, достичь ровного, единообразного размещения компонентов. Этот менеджер создает решетку (“таблицу”), состоящую из квадратов одинакового размера, в каждом из которых располагается один компонент. При использовании этого режима компоненты размещаются слева направо и сверху вниз по одному компоненту на квадрат. При помощи конструкторов класса GridLayout при создании объектов этого класса можно задать число сток и столбцов этой “таблицы”, а также величину отступов между строками и столбцами.

 

Менеджер размещения BorderLayout.При использовании менеджера BorderLayout окно контейнера разделяется на рамку и центральную часть. Каждый раз при добавлении нового компонента в контейнер необходимо указывать дополнительный параметр, который может принимать одно из следующих значений: "South" (“юг”, внизу), "North" (“север”, вверху), "East" (“восток”, вправо), "West" (“запад”, влево) и "Center" (в центре). Первые четыре параметра заставляют менеджер BorderLayout относить добавляемые компоненты к соответствующему краю контейнера - нижнему, верхнему, правому и левому. Параметр "Center" позволяет указать, что данный компонент может занять все оставшееся место. Таким образом, элементы, добавляемые с параметром "Center", будут изменять свой размер, заполняя место, не занятое другими компонентами.

 

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

Обычно для управления процесса перебора в режиме CardLayout используются отдельные органы управления, расположенные в другой панели, например, кнопки. Такие методы как first(), last(), next()и previous(), позволят отображать соответственно первую, последнюю, следующую и предыдущую страницу. Если вызвать метод next() при отображении последней страницы, в окне появится первая страница. Аналогично при вызове метода previous() для первой страницы отображается последняя страница.

Для того чтобы отобразить произвольную страницу, используется метод show(). Однако, этот метод позволяет отображать только те страницы, при добавлении которых в контейнер использовался метод add(), в параметрах которого указываются название компонента и ссылка на сам компонент.

 

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

Менеджер GridBagLayout является самым сложным менеджером компоновки. В нем используется наиболее совершенный алгоритм реагирования на изменение размеров контейнера, и позволяет реализовывать сложный интерфейс, в котором контейнер содержит много компонентов различных размеров, некоторые из которых должны находиться в одном и том же заданном положении относительно других. Когда используется этот менеджер, необходимо задавать параметры расположения для каждого компонента с помощью метода setConstraints(). Удобнее всего создать для каждого компонента экземпляр класса GridBagConstraints, что позволит изменять расположение этого компонента независимо от других.

Если в контейнере имеется несколько вложенных компонент-контейнеров, то при задании менеджеров размещения для них нужно указать, в каком контейнере он будет действовать, например:

inputPanel.setLayout(new BorderLayout());

 

Практические задания

 

1. Изучить основные классы пакета AWT/Swing и классы менеджеров компоновки.

2. Доработать программу, созданную в лабораторной работе № 2:

1) поделить рабочую область на 2 части. Визуализация переносится в левую часть окна, справа появляется панель управления;

2) добавить кнопки «Старт» и «Стоп» в панель управления. Они должны запускать и останавливать симуляцию соответственно. Если симуляция остановлена, то кнопка «Стоп» должна блокироваться. Если симуляция идет, то блокируется кнопка «Старт». Клавиши B и Eдолжны функционировать по-прежнему;

3) добавить переключатель «Показывать информацию», который разрешает отображение модального диалога из 7 пункта задания;

4) добавить группу из 2 исключающих переключателей: «Показывать время симуляции» и «Скрывать время симуляции». Клавиша Tдолжна функционировать по-прежнему;

5) используя различные менеджеры компоновки, сформировать интерфейс пользователя согласно индивидуальному заданию;

6) добавить в программу главное в меню и панель инструментов, в которых продублировать основные команды вашего интерфейса пользователя;

7) при остановке симуляции должно появляться модальное диалоговое окно (при условии, что оно разрешено) с информацией о количестве и типе сгенерированных объектов, а также времени симуляции. Вся информация выводится в элементе TextArea, недоступном для редактирования. В диалоговом окне должно быть 2 кнопки: «ОК» и «Отмена». При нажатии на «ОК» симуляции останавливается, а при нажатии на «Отмена», соответственно продолжается;

8) предусмотреть проверку данных вводимых пользователем. При вводе неверного значения обрабатывать исключительную ситуацию: выставлять значение по умолчанию и выводить диалоговое окно с сообщением об ошибке;

9) Реализовать следующие элементы управления:

- Периоды рождения объектов – текстовые поля;

- Для задания вероятностей рождения  объектов комбобокс и  список (шаг значений 10%);

- Дополнить интерфейс поясняющими метками.

Вопросы для самопроверки

 

1. Что такое GUI?

2. Какие графические библиотеки есть в Java?

3. Какой принцип работы компонентов AWT? Недостатки библиотеки.

4. Какой принцип работы компонентов Swing?

5. Что такое элементы управления и что такое контейнеры?

6. Какие классы элементов управления существуют?

7. Что необходимо сделать, чтобы добавить компонент в контейнер?

8. Как можно перехватить и обработать события, пришедшие от компонентов?

9. Какие типы переключателей существуют?

10. Как несколько переключателей объединить в группу?

11. Чем отличаются выпадающие и невыпадающие списки? Как осуществляется в них выбор элементов?

12. Что такое текстовые поля и текстовые области? Чем они отличаются?

13. Что такое контейнеры? Какие основные виды контейнеров существует?

14. Для чего чаще всего используются панели?

15. В чем основное отличие окон и панелей?

16. Что является обязательным параметром конструктора при создании экземпляра класса окон?

17. Каковы отличительные особенности имеют фреймы?

18. Как добавить меню в контейнер? Как реализуется вложенное меню?

19. Как создать новое меню и добавить в него элементы?

20. Какими методами обрабатываются события меню?

21. Для чего в основном используются окна диалогов?

22. Каковы важные отличия окон диалогов от фреймов?

23. Объект какого класса должен обязательно быть родителем диалогового окна?

24. Что такое модальное окно?

25. Как создать диалог своего класса?

26. Для чего предназначены менеджеры компоновки? Какие существуют режимы размещения?

 

ГЛАВА 4. КЛАССЫ-КОЛЛЕКЦИИ

При решении практических задач, в которых количество элементов заранее неизвестно, элементы надо часто удалять и добавлять, необходим быстрый поиск данных, можно использовать библиотеки классов-коллекций.

Класс Vector. В языке Java с самых первых версий был разработан класс Vector, предназначенный для хранения переменного числа элементов. В классе Vector из пакета java.util хранятся элементы типа Object, а значит, любого типа. Количество элементов может быть любым и наперед не определяться. Элементы получают индексы 0, 1, 2, ....

Кроме количества элементов, называемого размером(size) вектора, есть еще размер буфера — емкость(capacity) вектора. Обычно емкость совпадает с размером вектора, но можно ее увеличить методом ensureCapacity(int minCapacity) или сравнять с размером вектора методом trimToSize().

В Java 2 класс Vector был переработан, чтобы включить его в иерархию классов-коллекций. Поэтому многие действия можно совершать старыми и новыми методами. Рекомендуется использовать новые методы.

В классе четыре конструктора:

Vector () — создает пустой объект нулевой длины;

Vector (int capacity) — создает пустой объект указанной емкости capacity;

Vector (int capacity, int increment) — создает пустой объект указанной емкости capacity и задает число increment, на которое увеличивается емкость при необходимости;

Vector (Collection с) — вектор создается по указанной коллекции. Если capacity отрицательно, создается исключительная ситуация.

 

Методы класса Vector:

add (Object element) —  позволяет добавить элемент в конец вектора:

add (int index, Object element) —  можно вставить элемент в указанное место index. Элемент, находившийся на этом месте, и все последующие элементы сдвигаются, их индексы увеличиваются на единицу;

addAll (Collection coll) — позволяет добавить в конец вектора все элементы коллекции coll;

addAll(int index, Collection coll) —  вставляет в позицию index все элементы коллекции coll.

set (int index, object element) —  заменяет элемент, стоявший в векторе в позиции index, на элемент element;

Количество элементов в векторе всегда можно узнать методом size().

capacity()—   возвращает емкость вектора.

Логический метод isEmpty() возвращает true, если в векторе нет ни одного элемента.

Обратиться к первому элементу вектора можно методом firstEiement(), к последнему — методом lastEiement(), к любому элементу — методом get(int index). Эти методы возвращают объект класса Object. Перед использованием его следует привести к нужному типу.

Получить все элементы вектора в виде массива типа Object[] можно методами toArray().

Логический метод contains(Object element) возвращает true, если элемент element находится в векторе.

Логический метод containsAll(Collection с) возвращает true, если вектор содержит все элементы указанной коллекции.

Четыре метода позволяют отыскать позицию указанного элемента element:

indexOf(Object element) — возвращает индекс первого появления элемента в векторе;

indexOf(Object element, int begin) — ведет поиск, начиная с индекса begin включительно;

lastIndexOf(object element) — возвращает индекс последнего появления элемента в векторе;

lastIndexOf (Object element, int start) — ведет поиск от индекса start включительно к началу вектора.

Если элемент не найден, возвращается —1.

Логический метод remove(Object element) удаляет из вектора первое вхождение указанного элемента element. Метод возвращает true, если элемент найден и удаление произведено.

Метод remove (int index) удаляет элемент из позиции index и возвращает его в качестве своего результата типа object.

Удалить диапазон элементов можно методом removeRange(int begin, int end), не возвращающим результата. Удаляются элементы от позиции begin включительно до позиции end исключительно.

Удалить из данного вектора все элементы коллекции coll возможно методом removeAll(Collection coll).

Удалить последние элементы можно, просто урезав вектор методом  setSize(int newSize).

Удалить все элементы, кроме входящих в указанную коллекцию coil, разрешает логический метод retainAll(Collection coll).

Удалить все элементы вектора можно методом clear() или старым методом removeAllElements() или обнулив размер вектора методом setSize(0).


Дата добавления: 2018-04-15; просмотров: 411; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!