3966

Пакет Swing компонувальники LayoutManager

Лабораторная работа

Информатика, кибернетика и программирование

Лабораторна робота (Пакет Swing – компонувальники (LayoutManager)) Тема роботи: Пакет Swing – компонувальники (LayoutManager). Мета роботи: Дослідити роботу, одного з компонентів пакету Swing, компонувальники (LayoutManager). План ро...

Украинкский

2012-11-10

379.45 KB

5 чел.

8.

Лабораторна робота №8 (Пакет Swing – компонувальники

(LayoutManager))

Тема роботи: Пакет Swing – компонувальники (LayoutManager).

Мета роботи: Дослідити роботу, одного з компонентів пакету Swing, компонувальники

(LayoutManager).

План роботи

1. Ознамитися з LayoutManager.

2. Дослідити роботу компонувальників: FlowLayout, BorderLayout, CardLayout, BoxLayout,

GridLayout.

3. Навчитися добавляти компонувальники до контейнерів.

4. Навчитися задавати параметри компонувальників.

5. Вивчити властивості кожного компонувальника.

Теоретичні відомості

LayoutManager – це об’єкт, котрий визначає розміри та розташування компонентів в

межах контейнера. Хоча компоненти самі визначають свої розміри та вирівнювання, останнє

слово стосовно їх розташування належить компонувальнику контейнера. Задати компонувальник

можна використовуючи конструктор JPanel.

Наприклад:

JPanel panel = new JPanel(new BorderLayout());

Можна задати компонувальник після того як контейнер створено.

Наприклад:

Container contentPane = frame.getContentPane();

contentPane.setLayout(new FlowLayout());

Хоча рекомендується використовувати layout managers, можна створити

контейнер і встановити layout managers null. В цьому випадку ми використовуємо

абсолютне позиціонування, тобто ми повинні безпосередньо задати розміри та

розташування компонентів в межах контейнера. Недолік даного підходу в тому, що

компоненти не будуть коректно вирівняні коли розміри контейнеру змінюються.

Компоновульник FlowLayout.

Компонувальник FlowLayout надає найпростіший спосіб розташування

компонентів. Цей компонувальник є компонувальником по-замовчуванню для JPanel.

На малюнку показано приклад застосування даного компонувальника:

70


Приклад 1.

import javax.swing.*;

import java.awt.*;

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("FlowLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new FlowLayout());

contentPane.add(new JButton("Button 1"));

contentPane.add(new JButton("Button 2"));

contentPane.add(new JButton("Button 3"));

contentPane.add(new JButton("Long-Named Button 4"));

contentPane.add(new JButton("5"));

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Клас FlowLayout має три конструктори:

public FlowLayout()

public FlowLayout(int alignment)

public FlowLayout(int alignment, int horizontalGap, int verticalGap)

Аргумент alignment може бути FlowLayout.LEADING, FlowLayout.CENTER, or

FlowLayout.TRAILING. Якщо аргумент alignment дорівнює FlowLayout.LEADING –

компоненти будуть вирівнюватись по лівому краю, якщо FlowLayout.TRAILING - по

правому, якщо FlowLayout.CENTER – по центру (це значення по-замовчуванню).

Аргументи horizontalGap and verticalGap задають відстань між компонентами в пікселах.

Компонувальник BorderLayout

На малюнку показано розташування кнопок у випадку використання даного

компонувальника:

71


Приклад 2.

import javax.swing.*;

import java.awt.*;

public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("BorderLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

contentPane.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

contentPane.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

contentPane.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

contentPane.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

contentPane.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

72


Компонувальник CardLayout.

Даний компонувальник отримав свою назву по аналогії із колодою карт, коли

тільки верхня карта із цілої колоди є видимою. За власним бажанням ми можемо показати

будь-яку. Як правило до контейнера із CardLayout додаються інші об’єкти типу JPanel.

Приклад 3.

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionListener;

import java.awt.event.ActionEvent;

public class Lab4 extends JFrame

{

private CardLayout layoutCard;

private JCheckBox chboxSelect;

private JPanel pnlMain;

public Lab4()

{

setTitle("CardLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BorderLayout());

chboxSelect = new JCheckBox("Select panel");

chboxSelect.addActionListener(new SelectPanel());

chboxSelect.setSelected(true);

contentPane.add(chboxSelect, BorderLayout.NORTH);

JPanel pnlFlow = new JPanel(new FlowLayout());

JPanel pnlBorder = new JPanel(new BorderLayout());

layoutCard = new CardLayout();

pnlMain = new JPanel(layoutCard);

contentPane.add(pnlMain, BorderLayout.CENTER);

pnlMain.add(pnlFlow, "FlowLayout");

pnlMain.add(pnlBorder, "BorderLayout");

pnlFlow.add(new JButton("Button 1"));

pnlFlow.add(new JButton("Button 2"));

pnlFlow.add(new JButton("Button 3"));

pnlFlow.add(new JButton("Long-Named Button 4"));

pnlFlow.add(new JButton("5"));

pnlBorder.add(new JButton("Button 1 - NORTH"), BorderLayout.NORTH);

73


pnlBorder.add(new JButton("Button 2 - SOUTH"), BorderLayout.SOUTH);

pnlBorder.add(new JButton("Button 3 - WEST"), BorderLayout.WEST);

pnlBorder.add(new JButton("Button 4 - EAST"), BorderLayout.EAST);

pnlBorder.add(new JButton("Button 5 - CENTER"), BorderLayout.CENTER);

}

class SelectPanel implements ActionListener

{

public void actionPerformed(ActionEvent e)

{

if (chboxSelect.isSelected())

layoutCard.show(pnlMain, "FlowLayout");

else

layoutCard.show(pnlMain, "BorderLayout");

}

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Результат виконання програми

На даному прикладі показані дві панелі, додані до панелі із компонувальником

CardLayout. Для того, щоб показати одну із панель – натисніть селектор (JCheckBox) із

написом “Select panel”.

Коли ми додаємо панелі до контейнера ми повинні задати стрічку, котра

ідентифікує дану панель. В даному прикладі ми додаємо першу панель із стрічкою

"FlowLayout", а другу – із "BorderLayout". Для того, щоб показати одну із панелей,

необхідно передати функції show() як аргумент стрічку, котра ідентифікує панель.

Компонувальник BoxLayout.

Цей компонувальник подібний до FlowLayout, але використовуючи його можна задавати

вісь, вздовж якої будуть додаватись компоненти.

Приклад 4.

import javax.swing.*;

import java.awt.*;

74


public class Lab4 extends JFrame

{

public Lab4()

{

setTitle("CardLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new BoxLayout(contentPane, BoxLayout.Y_AXIS));

JButton button1 = new JButton("Button 1");

contentPane.add(button1);

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

JButton button5 = new JButton("5");

contentPane.add(button5);

}

public static void main(String[] args)

{

Lab4 lab4 = new Lab4();

lab4.pack();

lab4.setVisible(true);

}

}

Результат виконання даної програми показано на даному малюнку:

75


В конструкторі BoxLayout(contentPane, BoxLayout.Y_AXIS) в якості аргументу

передається значення BoxLayout.Y_AXIS, тому кнопки розташовані по вертикалі.

Крім того, BoxLayout має ряд особливостей. У випадку використання даного

компонувальника береться до уваги також вирівнювання для кожного компонента, доданого до

контейнера. Ця властивість компонента задається таким чином: button1.setAlignmentX(float x),

Де аргумент x може приймати значення від 0.0 до 1.0. Існує три наперед визначених

можливості:

JButton.CENTER_ALIGNMENT = 0.5

JButton.LEFT_ALIGNMENT = 0.0

JButton.RIGHT_ALIGNMENT = 1.0

На наступному малюнку показано три варіанти вирівнювань:

Наступна особливість – розмір кнопки визначається її максимальною величиною. Якщо ми

задамо максимальний розмір кнопки таким, що її ширина буде більшою, ніж екран – кнопка

займе весь контейнер по ширині.

Компонувальник GridLayout

Компонувальник GridLayout розташовує компоненти у вигляді сітки комірок. Кожен

компонент займає весь простір в межах комірки, причому всі комірки мають одинаковий розмір.

Якщо ми змінимо розмір контейнера – всі комірки теж змінять свої розміри, займаючи весь

вільний простір.

Приклад 5.

import javax.swing.*;

import java.awt.*;

public class Lab5 extends JFrame

{

public Lab5()

{

setTitle("GridLayoutDemo");

Container contentPane = getContentPane();

contentPane.setLayout(new GridLayout(0,2));

JButton button1 = new JButton("Button 1");

76


contentPane.add(button1);

JButton button2 = new JButton("Button 2");

contentPane.add(button2);

JButton button3 = new JButton("Button 3");

contentPane.add(button3);

JButton button4 = new JButton("Long-Named Button 4");

contentPane.add(button4);

JButton button5 = new JButton("5");

contentPane.add(button5);

}

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

}

}

В результаті виконання даної програми ви побачите наступне вікно:

Клас GridLayout має два конструктори:

public GridLayout(int rows, int columns)

public GridLayout(int rows, int columns, int horizontalGap, int verticalGap)

Принаймні один із аргументів rows або columns повинен не дорівнювати нулю; якщо

один із аргументів нуль, як в даному прикладі, тоді кількість рядків визначається кількістю

доданих кнопок, причому кнопки розташовується в дві колонки. Аргументи horizontalGap і

verticalGap дозволяють задати відстань між компонентами в пікселах. По замовчуванню ця

відстань дорівнює нулю. Компонувальник GridBagLayout.

Приклад 6.

import javax.swing.*;

import java.awt.*;

public class Lab5 extends JFrame

{

public Lab5()

77


{

setTitle("GridBagLayoutDemo");

Container pane = getContentPane();

pane.setLayout(new GridBagLayout());

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

JButton button2 = new JButton("Button 2");

c.gridx = 1;

c.gridy = 0;

pane.add(button2, c);

JButton button3 = new JButton("Button 3");

c.gridx = 2;

c.gridy = 0;

pane.add(button3, c);

JButton button4 = new JButton("Long-Named Button 4");

c.ipady = 40;

//make this component tall

c.weightx = 0.0;

c.gridwidth = 3;

c.gridx = 0;

c.gridy = 1;

pane.add(button4, c);

JButton button5 = new JButton("5");

c.ipady = 0;

//reset to default

c.weighty = 1.0; //request any extra vertical space

c.anchor = GridBagConstraints.PAGE_END; //bottom of space

c.insets = new Insets(10,0,0,0); //top padding

c.gridx = 1;

//aligned with button 2

c.gridwidth = 2; //2 columns wide

c.gridy = 2;

//third row

pane.add(button5, c);

}

public static void main(String[] args)

{

Lab5 lab5 = new Lab5();

lab5.pack();

lab5.setVisible(true);

78


}

}

На малюнку показано вікно, збудоване із використанням даного компонувальника.

GridBagLayout є найбільш гнучким і разом з тим найбільш складним в платформі Java.

Він дозволяє розміщувати компоненти у виляді сітки із рядів і колонок. При цьому компоненти

можуть займати декілька рядків або колонок. Також колонки можуть мати різну ширину, а рядки

різну висоту. При цьому для визначення висоти і ширини комірки приймається до уваги

найоптимальніший розмір компонента. Цей розмір отримується функцією getPrefferedSize(). Його

також можна задати для кожного компонента з допомогою функції setPrefferedSize(Dimension

dim).

На наступному малюнку показана сітка для попереднього вікна. Як видно, сітка має три

колонки і три рядки. Кнопка в другому рядку займає всі колонки; кнопка в третьому рядку займає

дві праві колонки.

Якщо ми збільшимо вікно, як показано на малюнку, то побачимо, що нижній ряд, де

знаходиться Button 5, займає весь новий вертикальний простір. Новий горизонтальний простір

ділиться між всіма колонками. Така поведінка компонентів задається параметрами

GridBagLayout. Слід відмітити, що кожен компонент займає весь можливий горизонтальний

простір, але не весь можливий вертикальний простір (як можна бачити у Button 5). Ця поведінка

теж задається в програмі.

Для того, щоб задати поведінку кожного компонента, ми повинні задати для кожного із

них свої констрейнти (contraints). Констрейнт – це об’єкт класу GridBagConstraints. При

додаванні компонента до контейнера, ми повинні вказати констрейнт для кожного компонента.

Наприклад:

GridBagConstraints c = new GridBagConstraints();

c.fill = GridBagConstraints.HORIZONTAL;

79


JButton button1 = new JButton("Button 1");

c.weightx = 0.5;

c.gridx = 0;

c.gridy = 0;

pane.add(button1, c);

Нижче пояснюється значення кожної змінної класу GridBagConstrains:

gridx, gridy

Задає рядок і колонку де буде знаходитись верхній лівий куток компонента. По

замовчуванню, gridx=0 і gridy=0.

gridwidth, gridheight

Задає кількіть колонок (gridwidth) або рядків (gridheight) які буде займати

компонент. Або інакше кажучи, цим параметром задається кількість комірок, але не пікселів,

котрі займає компонент. Значення по замовчуванню - 1.

fill

Якщо розмір оптимальний розмір компонента (визначається get/setPrefferedSize() ) є

меншим ніж комірка, в якій знаходиться компонент, цей параметр задає, яким чином буде

зайнятий

вільний

простір

в

межах

комірки.

Значення

по

замовчування

GridBagConstraints.NONE, Якщо цей параметр - GridBagConstraints.HORIZONTAL –

компонент займає весь можливий горизонтальний простір, якщо - VERTICAL - компонент займає

весь можливий вертикальний простір, а у випадку BOTH – компонент займає всю комірку.

ipadx, ipady

Задає мінімальний можливий розмір компонента в комірці. По замовчуванню – 0. Ширина

компонента буде не менше, ніж його мінімальна ширина плюс ipadx*2 піксел, аналогічно,

висота компонента буде не меншою, ніж його мінімальна висота плюс ipady*2 піксел.

(Мінімальні розміри компонента задаються функцією getMinimumSize()).

insets

Задає відстань між компонентом та краєм комірки, в якій знаходиться компонент. Ця

величина – обєкт класу Insets(int top, int left, int bottom, int right). По замовчуванню, дорівнює null.

anchor

Використовується, коли компонент є меншим, ніж комірка, в якій він знаходиться,

визначає розташування компонента в комірці. Можливі значення (GridBagConstraints

константи): CENTER (по замовчуванню), PAGE_START, PAGE_END, LINE_START, LINE_END,

FIRST_LINE_START, FIRST_LINE_END, LAST_LINE_END, і LAST_LINE_START.

Нижче на малюнку показано розташування компонента в межах комірки із заданими

значеннями anchor.

----------------------------------------------------------------------| NORTHEAST

NORTH

NORTHWEST

|

|

|

|

|

|EAST

CENTER

WEST

|

|

|

|

|

|SOUTHEAST

EAST

SOUTHWEST

|

-----------------------------------------------------------------------weightx, weighty

80


Ці параметри визначають те, яким чином розподіляється вільна область контейнера.

Параметр weightx - визначає як розподіляється область між колонками, а weighty – між

рядками. Можливі значення – від 0.0 до 1.0.

Якщо ми не задали ці параметри, то всі компоненти будуть знаходитись по центру

контейнера. Якщо одна із колонок має weightx=1.0, тоді вона буде займати весь вільний простір

контейнера по ширині. Аналогічно розподіляється простір по-вертикалі.

Порядок виконання роботи

1. Виконайте приклад 1 із різними значеннями аргументу alignment.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється

розташування кнопок.

2. Виконайте приклад 2 із різною кількістю доданих кнопок.

Спробуєте змінити розміри вікна. Зверніть увагу як при цьому змінюється

розташування кнопок. Спробуйте додати дві кнопки з одним і тим же значенням

BorderLayout.

3. Виконайте приклад 3.

4. Виконайте приклад 4. Задайте різні значення вирівнювання для всіх кнопок:

button1.setAlignmentX(JButton.CENTER_ALIGNMENT).Задайте

значення

максимального розміру кнопок, як показано нижче: button1.setMaximumSize(new

Dimension(Integer.MAX_VALUE,30)).

Спробуйте поміняти розмір вікна.

5.Виконайте приклад 5. Змініть кількість колонок та рядків в конструкторі. Зверніть увагу

на поведінку кнопок при зміні розмірів вікна.

6. Виконайте приклад 6.

7. Зробити висновки.

8. Оформити звіт. У звіті повинно бути текст програми і скріншоти результатів.

9. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм

[Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер

лабораторної роботи, k – номер програми.

Контрольні питання

1. Який з компонувальників використовує змінну констрейнт (Constraints)?

2. Який параметр у компонувальнику GridBagLayout задає відстань між компонентом та краєм

комірки, в якій знаходиться компонент.

3. Який параметр у компонувальнику GridBagLayout задає мінімальний можливий розмір

компонента в комірці.

4. Який параметр у компонувальнику GridBagLayout задає кількіть колонок або рядків які буде

займати компонент.

5. Який параметр у компонувальнику GridBagLayout задає рядок і колонку де буде знаходитись

верхній лівий куток компонента.

6. Який з компонувальників дозволяє розміщувати компоненти у виляді сітки із рядів і колонок.

При цьому компоненти можуть займати декілька рядків або колонок. Також колонки можуть

мати різну ширину, а рядки різну висоту. При цьому для визначення висоти і ширини

комірки приймається до уваги найоптимальніший розмір компонента.

7.

Який компонувальник розташовує компоненти у вигляді сітки комірок.

81



 

А также другие работы, которые могут Вас заинтересовать

22111. Структурная схема конечного автомата 26.5 KB
  Комбинационная схема строится из логических элементов образующих функционально полную систему а память на элементарных автоматах обладающих полной системой переходов и выходов. Каждое состояние абстрактного автомата ai i=0n кодируется в структурных автоматах набором состояний элементов памяти Q2 R=1R. Здесь Q состояние автомата а ai = {0 1} Как и прежде Q Общее число необходимых элементов памяти можно определить из следующего неравенства 2R n 1.
22112. Табличный метод структурного синтеза конечных автоматов 75.5 KB
  На этапе структурного синтеза выбираем также способ кодирования состояний и выходных сигналов заданного автомата через состояния и выходные сигналы элементарных автоматов в результате чего составляют кодированные таблицы переходов и выходов. Функции возбуждения элементарных автоматов и функции выходов получаются на основе кодированной таблицы переходов и выходов. Рассмотрим примеры синтеза которые позволяют сформулировать общий алгоритм структурного синтеза конечных автоматов.
22113. Технические особенности конечных автоматов 36 KB
  Здесь u сигналы возбуждения триггера. На практике триггера часто выполняются в синхронном варианте синхронные триггера когда упомянутые элементы u включают в схему триггера. Например схему синхронного триггера RSтипа можно рассматривать как состоящую из асинхронного RSтриггера ко входам R и S которого подключены двухвходовые элементы И. Очевидно синхронные триггера будут сохранять свои состояния при С=0 а переходы в них возможны при С=1 то переходы в синхронном триггере будут осуществляться также как в асинхронном.
22114. Понятие устойчивости конечного автомата 48 KB
  Дело в том что триггера в схеме имеет различные времена задержек сигналов обратной связи которые поступают с выходов триггеров на их входы через комбинационную схему II. По этим причинам если при переходе автомата из состояния ai в as должны измениться состояния нескольких триггеров то между выходными сигналами этих триггеров начинаются гонки. изменит свое состояние раньше других триггеров может через цепь обратной связи изменить может изменить сигналы возбуждения на входах других триггеров до того момента как они изменят свои состояния....
22115. Синтез конечных автоматов 31.5 KB
  В ЦА выходные сигналы в данный момент времени зависят не только от значения входных сигналов в тот же момент времени но и от состояния схемы которое в свою очередь определяется значениями входных сигналов поступивших в предшествующие моменты времени. Понятие состояния введено в связи с тем что часто возникает необходимость в описании поведения систем выходные сигналы которых зависят не только от состояния входов в данный момент времени но и от некоторых предысторий т. Состояния как раз и соответствуют некоторой памяти о прошлом...
22116. Способы задания автомата 362 KB
  Существует несколько способов задания работы автомата но наиболее часто используются табличный и графический. Совмещенная таблица переходов и выходов автомата Мили: xj ai a0 an x1 a0x1 a0x1 anx1 anx1 xm a0xm a0xm anxm anxm Задание таблиц переходов и выходов полностью описывает работу конечного автомата поскольку задаются не только сами функции переходов и выходов но и также все три алфавита: входной выходной и алфавит состояний. Для задания автомата Мура требуется одна таблица поскольку в этом...
22117. Частичные автоматы 194 KB
  Оказывается что для любого автомата Мили существует эквивалентный ему автомат Мура и обратно для любого автомата Мура существует эквивалентный ему автомат Мили. Рассмотрим алгоритм перехода от произвольного конечного автомата Мили к эквивалентному ему автомату Мура. Требуется построить эквивалентный ему автомат Мура Sb = {Ab Xb Yb b b} у которого Xb = Xa Yb = Ya т. Для определения множества состояний Ab автомата Мура образуем всевозможные пары вида ai yg где yg выходной сигнал приписанный входящей в ai дуге.
22118. Абстрактный синтез конечных автоматов 25.5 KB
  Составить аналогичную таблицу описывающую работу конечного автомата не представляется возможным т. множество допустимых входных слов автомата вообще говоря бесконечно. Мы рассмотрим один из возможных способов формального задания автоматов а именно задание автомата на языке регулярных событий. Представление событий в автоматах.
22119. Операции в алгебре событий 24.5 KB
  Дизъюнкцией событий S1 S2 Sk называют событие S = S1vS2vvSk состоящее из всех слов входящих в события S1 S2 Sk. Произведением событий S1 S2 Sk называется событие S = S1 S2 Sk состоящее из всех слов полученных приписыванием к каждому слову события S1 каждого слова события S2 затем слова события S3 и т. слова входящие в события S1S2 и S2S1 различны: т. Итерацией события S называется событие{S} состоящее из пустого слова e и всех слов вида S SS SSS и т.