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



 

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

8901. Характеристика основних форм безготівкових розрахунків 175.17 KB
  Характеристика основних форм безготівкових розрахунків. Розрахунки із застосуванням платіжних доручень. Розрахунки із застосуванням платіжних вимог-доручень. Розрахунки платіжними вимогами. Розрахунки із застосуванням розраху...
8902. Порядок здійснення міжбанківських розрахунків 151.32 KB
  Порядок здійснення міжбанківських розрахунків. Необхідність, сутність і класифікація міжбанківських розрахунків. Система електронних платежів Національного банку України. Відкриття та закриття кореспондентських рахунків банків...
8903. Операції банків з готівкою 82.6 KB
  Операції банків з готівкою Завдання банків з організації готівкового грошового обігу. Вимоги до організації готівкових розрахунків. Порядок оформлення касових операцій. Порядок здійснення касових операцій у банківських устано...
8904. Операції банків з готівкою. Емісійно-касова діяльність Національного банку України 136.46 KB
  Операції банків з готівкою Операції банків з готівкою для своїх клієнтів. Порядок прогнозування касових оборотів. Емісійно-касова діяльність Національного банку України. 1. Операції банків з готівкою для своїх клієнтів Готівкові оп...
8905. Операції банків з платіжними картками 198.07 KB
  Операції банків з платіжними картками Сутність та основні види платіжних карток Емісія, еквайринг та операції із застосуванням платіжних карток Розрахунки з використанням платіжних карток Національна система масових електронн...
8906. Кредитні операції банків. Кредитний ризик та методи управління ним 99.13 KB
  Кредитні операції банків Класифікація кредитних операцій банків. Поняття кредитного механізму та основні етапи процесу банківського кредитування. Особливості видачі позик та порядок їхнього оформлення. Кредитний ризик та мето...
8907. Кредитні операції банків. Кредитна політика банківських установ 269.68 KB
  Кредитні операції банків Оцінювання кредитоспроможності клієнта як метод мінімізації кредитного ризику. Форми забезпечення повноти та своєчасності повернення позик. Порядок формування та використання резервів для покриття втрат ві...
8908. Неторговельні операції банків в іноземній валюті 35.01 KB
  Неторговельні операції банків в іноземній валюті Операції з готівковою іноземною валютою. Операції банків з дорожніми чеками. Міжнародні перекази коштів фізичних осіб. 1. Операції з готівковою іноземною валютою Операції з готівково...