Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на java / Лекции / Тема 6.1 Основы Swing.ppt
Скачиваний:
120
Добавлен:
14.02.2015
Размер:
891.39 Кб
Скачать

Swing

Менеджер блочного размещения BoxLayout и класс Box

Измененный конструктор класса SimpleWindow :

SimpleWindow() {super("Пробное окно");

setDefaultCloseOperation(EXIT_ON_CLOSE); Box box = Box.createVerticalBox(); box.add(new JButton("Кнопка")); box.add(Box.createVerticalStrut(10)); box.add(new JButton("+")); box.add(Box.createVerticalGlue()); box.add(new JButton("-"));

box.add(Box.createVerticalStrut(10));

box.add(new JButton("Кнопка с длинной надписью")); setContentPane(box);

setSize(250, 250);

}

21

Swing

Менеджер BoxLayout размещает элементы на панели в строку или в столбец.

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

конструктором,

а

одним

из

двух

статических

методов,

определенных

в

классе Box: createHorizontalBox() и createVerticalBox().

 

 

 

Элементы, добавленные на панель с блочным размещением, выстраиваются один за другим. Расстояние между элементами по умолчанию нулевое. Однако вместо компонента можно добавить невидимую «распорку», единственная задача которой — раздвигать соседние элементы, обеспечивая между ними заданное расстояние. Горизонтальная распорка создается статическим методом createHorizontalStrut(int width), а вертикальная — методомcreateVerticalStrut(int height). Оба метода определены в классе Box, а целочисленный параметр в каждом из них определяет размер распорки.

Кроме того, на такую панель можно добавить еще один специальный элемент — своеобразную «пружину». Если размер панели будет больше, чем необходимо для оптимального размещения всех элементов, те из них, которые способны растягиваться, будут стараться заполнить дополнительное пространство собой. Если же разместить среди элементов одну или несколько «пружин», дополнительное свободное пространство будет распределяться и в эти промежутки между элементами. Горизонтальная и вертикальная пружины создаются соответственно методами createHorizontalGlue() иcreateVerticalGlue().

Понять особенности работы этого менеджера лучше на наглядном примере. Мы расположим четыре кнопки вертикально, поставив между двумя центральными «пружину», а между остальными

— распорки в 10 пикселов.

22

Swing

Особенности выравнивания элементов

Изменим предыдущий пример, выровняв третью кнопку по правому краю. Заменим строку:

box.add(new JButton("-"));

На три:

JButton rightButton = new JButton("-"); rightButton.setAlignmentX(JComponent.RIGHT_ALIGNMENT); box.add(rightButton);

23

Swing

В примере с вертикальной панелью все кнопки оказались выровнены по левому краю. Такое выравнивание по горизонтали принято по умолчанию.

Однако при разработке окна программы может понадобиться, чтобы какие-то элементы были выровнены иначе, например, по правому краю или по центру. Для того, чтобы установить выравнивание любого визуального компонента (например, кнопки или панели), используются методы setAlignmentX(float alignment) — выравнивание по горизонтали и setAlignmentY(float alignment) — выравнивание по вертикали.

В качестве параметра проще всего использовать константы, определенные в классе JComponent.

Для выравнивания по горизонтали

служат

константы LEFT_ALIGNMENT (по левому

краю), RIGHT_ALIGNMENT (по

правому

краю)

и CENTER_ALIGNMENT (по центру). Для

выравнивания по вертикали

—BOTTOM_ALIGNMENT (по нижнему краю), TOP_ALIGNMENT (по

верхнему краю) и CENTER_ALIGNMENT (по центру).

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

Нам пришлось ввести переменную для обращения к этой кнопке, поскольку теперь нам нужно выполнить с ней не одно, а два действия: установка выравнивания по правому краю и добавление

впанель. Прежний прием — одновременное создание кнопки и передача ее в качестве параметра

вметод — здесь не сработает.

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

Объяснение просто. При выравнивании по правому краю объект не прижимается к правому краю компонента. Вместо этого он прижимается правым краем к невидимой линии выравнивания. Все остальные компоненты прижимаются к этой линии своим левым краем, поэтому и получается наблюдаемый эффект.

24

Swing

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

Замечание. Параметр выравнивания на самом деле представляет собой вещественное число в диапазоне от 0 до 1. Он показывает, какая часть компонента окажется слева от линии

выравнивания,

т.е.

в

каких

пропорциях

компонент

будет

«разрезан».

Константы LEFT_ALIGNMENT и

TOP_ALIGNMENT

на

самом

деле

равны

0, RIGHT_ALIGNMENT и BOTTOM_ALIGNMENT равны 1, а CENTER_ALIGHNMENT — 0.5. Можно подставлять эти числа напрямую (хотя использование констант значительно повышает наглядность!), а можно выбрать любое другое число от 0 до 1 и настроить совершенно произвольное выравнивание.

25

Swing

Ручное размещение элементов

Методы для задания координат элемента: setLocation(int x, int y), setLocation(Point point)

Размещение элемента b в точности в то место, которое занимает элемент a:

b.setLocation(a.getLocation());

Методы для задания размера элемента: setSize(int width, int height), setSize(Dimension size)

b.setSize(a.getSize());

26

Swing

Если в качестве менеджера размещения панели установить null, элементы не будут расставляться автоматически. Координаты каждого элемента необходимо в этом случае указать явно, при этом они никак не зависят от размеров панели и от координат других элементов. По умолчанию координаты равны нулю (т.е. элемент расположен в левом верхнем углу панели). Размер элемента также необходимо задавать явно (в противном случае его ширина и высота будут равны нулю и элемент отображаться не будет). Координаты элемента можно задать одним из следующих методов: setLocation(int x, int y) или setLocation(Point point).

Эти методы работают аналогично, устанавливая левый верхний угол элемента в точку с заданными координатами. Разница в способе задания точки. Можно представить точку двумя целыми числами, а можно объектом класса Point. Класс Pointп о сути представляет собой ту же пару чисел, его конструктор имеет вид Point(int x, int y). Получить доступ к отдельной координате можно методами getX() и getY().

Можно задаться вопросом: зачем использовать класс Point, если можно просто передать пару чисел? Но дело в том, что многие полезные методы возвращают результат — координаты некоторой точки — в виде объекта этого класса. Например, метод getLocation(), возвращающий координаты элемента. Предположим, нам нужно поместить элемент b в точности в то место, которое занимает элемент a. Этого легко добиться одной строкой: b.setLocation(a.getLocation());

Размер элемента задается одним из двух методов: setSize(int width, int height) или setSize(Dimension size). Эти методы работают одинаково — разница, как и в прошлый раз, в способе передачи параметра. Класс Dimension, аналогично классу Point, просто хранит два числа, имеет конструктор с двумя параметрами: Dimension(int width, int height) и позволяет получить доступ к своим составляющим — ширине и высоте — с помощью простых методов getWidth() и getHeigth(). Для того, чтобы получить текущий размер элемента, можно воспользоваться методом getSize(), возвращающего объект класса Dimension. Элемент b можно сделать точно такого же размера, как элемент a, выполнив команду: b.setSize(a.getSize());

27

Swing

Ручное размещение элементов

Измененный конструктор класса SimpleWindow :

SimpleWindow() {super("Пробное окно");

setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel panel = new JPanel(); panel.setLayout(null);

JButton button = new JButton("Кнопка"); button.setSize(80, 30); button.setLocation(20,20); panel.add(button);

button = new JButton("Кнопка с длинной надписью"); button.setSize(120, 40); button.setLocation(70,50);

panel.add(button);

setContentPane(panel); setSize(250, 150);

}

28

Swing

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

Мы используем одну и ту же переменную button для обращения к обеим кнопкам (причем, второй раз ее описывать не нужно). В самом деле, осуществив все необходимые операции с первой кнопкой и зная, что обращаться к ней нам больше не понадобится, мы используем «освободившуюся» переменную для манипуляций со второй.

29

Swing

Автоматическое определение размеров компонентов

Методы возвращают минимально допустимый, максимально допустимый и предпочтительный размеры визуального компонента:

getMinimumSize(),

getPreferredSize(),

getMaximumSize().

Всеми тремя размерами можно управлять с помощью соответствующим методов set:

setMinimumSize(Dimension size),

setPreferredSize(Dimension size),

setMaximumSize(Dimension size).

Чаще всего используется простой прием, когда элементу «не рекомендуется» увеличиваться или уменьшаться относительно своих предпочтительных размеров. Это легко сделать командой:

element.setMinimumSize(element.getPreferredSize());

30