Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
JAVA_programming_Gorban / JAVA_programming_Gorban.pdf
Скачиваний:
41
Добавлен:
23.02.2016
Размер:
14.53 Mб
Скачать

175

Програмування у Java

Урок 11. Розміщення компонентів

Менеджер FlowLayout

Менеджер BorderLayout

Менеджер GridLayout

Менеджер CardLayout

Менеджер GridBagLayout

Заключення

Впопередньому уроці ми розміщували компоненти "вручну", задаючи їх розміри і положення в контейнері абсолютними координатами в координатній системі контейнера. Для цього ми застосовували метод setBounds(). Такий спосіб розміщує компоненти з точністю до пікселя, але не дозволяеє переміщати їх. При зміні розмірів вікна за допомогою миші компоненти залишаться на своїх місцях, привязаними до лівого верхнього кута контейнера. Крім того, немає гарантії, що всі монsтори відобразять компоненти так, як ви задумали. Щоб врахувати зміну розмірів вікна, треба задати розміри і положення компонента відносно розмірів контейнера, наприклад, так:

int w = getSize().width; // Одержимо ширину int h = getSize().height; //і висоту контейнера

Button b = new Button("OK"); // Створюємо кнопку b.setBounds(9*w/20, 4*h/5, w/10, h/10);

і при всякій зміні розмірів вікна задавати розташувння компонента заново. Щоб позбавити програміста від цієї кропіткої роботи, в бібліотеку AWT внесені два интерфейси: LayoutManager і породжений від нтого інтерфейс LayoutManager2, а також пять реалізацій цих інтерфейсів: класи BorderLayout, CardLayout, FlowLayout, GridLayout і GridBagLayout. Ці класс названі менеджерами розміщення (layout manager)

компонентів. Кожний програміст може створити свої менеджери розміщення, реалізувавши інтерфейси LayoutManager або LayoutManager2. Подивимося, як розміщують компоненти ці класи.

11.1. Менеджер FlowLayout

Найбільш просто поступає менеджер розміщення FlowLayout. Він укладає в контейнер один компонент за другим зліва направо як цеглини, переходячи від верхніх рядів до нижніх. При зміні розміру контейнера "цеглини" перестроюються, як показано на рис. 11.1. Компоненти поступають в тому порядку, в якому вони задані в методах add(). В кожному ряді компоненти могжть притискуватися до лівого краю, якщои в конструкторі аргумент align рівний FlowLayout. LEFT, до правого краю, якщо цей аргумент FlowLayout. RIGHT, або збиратися в середині ряду, якщо FlowLayout.CENTER. Між компонентами можна залишити проміжки (gap) по горизонталі hgap і вертикалі vgap. Це задається в конструкторі:

FlowLayout(int align, int hgap, int vgap)

Другий конструктор задає проміжки розміром 5 пікселів: FlowLayout(int align)

Третій конструктор визначає вирівнювання по центру і проміжки 5 пікселів: FlowLayout()

Після формуванняя обєкта ці параметри можна змінити методами: setHgapfint hgap), setVgap(int vgap), setAlignment(int align)

В лістинзі 11.1 створюється кнопка Button, мітка Label, кнопка вибора Сheckbox, розкриваючийся список Сhoice, поле ввелдення TextField і все це розміщується в контейнері Frame. Рис. 11.1 містить вигляд цих компонентів при різних розмірах контейнера.

Лістинг 11.1. Менеджер розміщення FlowLayout

import java.awt.*; import java.awt.event.*;

class FlowTest extends Frame{

176

FlowTest(String s) { super(s);

setLayout (new FlowLayout (FlowLayout.LEFT, 10, 10)); add(new Button("Button"));

add(new Label("Label")); add(new Checkbox("Choice")); add(new Choice());

add(new TextField("Help", 6)); setSize(300, 100); setVisible(true);

}

public static void main(String[] args){

Frame f= new FlowTest(" Менеджер FlowLayout"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.1. Розміщення компонентів за допомогою FlowLayout

11.2. Менеджер BorderLayout

Менеджер разміщення BorderLayout ділить контейнер на пять нерівних областей, повністю заповнюючи кожну область одним компонентом, як показано на рис. 11.2. Области отримали географічні назви

NORTH, SOUTH, WEST, EAST і CENTER. Метод add() у випадку застосування BorderLayout має два аргументи: посилку на компонент comp і область region, в яку поміщається компонент — одну із перечислених вище констант: add(Component comp, String region). Метод add (Component comp) з одним аргументом поміщає компонент в область CENTER. В класi два конструктори:

BorderLayout() — між областями немає проміжків;

BorderLayout(int hgap int vgap) — між областями залишається горизонтальні hgap і вертикальні vgap проміжки, задані в пікселях.

Якщо в контейнер поміщається менше пяти компонентів, то деякі області не використовуються і не займають місце в контейнері, як можна помітити на рис. 11.3. Якщо не зайнята область CENTER, то компоненти притискуються до границь контейнера.

В лістинзі 11.2 створюються пять кнопок, розміщених в контейнері. Замітьте відсутність установки менеджера в контейнері setLayout() — менеджер BorderLayout установлений в контейнер Frame по замовчуванню. Результат розміщення показаний на рис. 11.2.

Лістинг 11.2. Менеджер розміщення BorderLayout

import java.awt.*;

import java.awt.event.* ; class BorderTest extends Frame{ BorderTest(String s){ super(s);

add(new Button("North"), BorderLayout.NORTH); add(new Button("South"), BorderLayout.SOUTH); add(new Button("West"), BorderLayout.WEST);

177

add(new Button("East"), BorderLayout.EAST); add(new Button("Center"));

setSize(300, 200); setVisible(true);

}

public static void main(String[] args){

Frame f= new BorderTest(" Менеджер BorderLayout"); f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.2. Області розміщення BorderLayout

Менеджер розміщення BorderLayout здається незручним: він має не більше пяти компонентів, останні розтікаються по всій области, області мають дивний вигляд. Але справа в тому, що в кожну область можна помістити не компонент, а панель, і розміщувати компоненти на ній, як зроблено в лістинзі 11.3 і показано на рис. 11.3. Нагадаємо, що на панелі Panel менеджер розміщення по замовчуванню

FІowLayout.

Лістинг 11.3. Складне компонування

import java.awt.*; import java.awt.event.*;

class BorderPanelTest extends Frame{ BorderPanelTest(String s){

super(s);

//Створюємо панель р2 з трьома кнопками

Panel p2 = new Panel(); p2.add(new Button("Execute")); p2.add(new Button("Cancel")); p2.add(new Button("Exit")); Panel p1 = new Panel(); p1.setLayout(new BorderLayout());

//Поміщаємо панель р2 з кнопками на "півдні" панелі р1 p1.add(p2, BorderLayout.SOUTH);

//Поле введення поміщаємо на "півночі"

p1.add(new TextField("Input Field", 20), BorderLayout.NORTH); // Область введення поміщається в центрі

p1.add(new TextArea("Input Area", 5, 20, TextArea.SCROLLBARS_NONE), BorderLayout.CENTER);

178

add(new Scrollbar(Scrollbar.HORIZONTAL), BorderLayout.SOUTH); add(new Scrollbar(Scrollbar.VERTICAL), BorderLayout.EAST); // Панель p1 поміщаємо в "центрі" контейнера

add(p1, BorderLayout.CENTER); setSize(200, 200); setVisible(true) ;

}

public static void main(String[] args){

Frame f= new BorderPanelTest(" Складне компонування"); f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.3. Компонування за допомогою FІowLayout і BorderLayout

11.3. Менеджер GridLayout

Менеджер розміщення GridLayout розставляє компоненти в таблицю із заданим в конструкторі числом рядків rows і стовпців columns:

GridLayout(int rows, int columns).

Всі компоненти отримують одинаковий розмір. Проміжків між компонентами немає. Другий конструктор дозволяє задати проміжки між компонентами в пікселях по горизонталі hgap і вертикалі vgap:

GridLayout(int rows, int columns, int hgap, int vgap)

Конструктор по заовчуванню GridLayout() задає таблицю розміром 0x0 без проміжків між компонентами. Компоненти будуть розташовуватися в одному рядку. Компоненти розміщуються менеджером GridLayout злiва направо по рядкам створеної таблиці в тому порядку, в якому вони задані в методах add(). Нульова кількість рядків або стовпців означає, що менеджер сам створить потрібне їх число. В лістинзі 11.4 розміщуються кнопки для калькулятора, а рис. 11.4 показує, як виглядає це розміщення.

Лістинг 11.4. Менеджер GridLayout

import java.awt.*; import java.awt.event.*; import java.util.*;

class GridTest extends Frame{ GridTest(String s){ super(s); setLayout(new GridLayout(4, 4, 5, 5)); StringTokenizer st =

new StringTokenizer("7 8 9 / 4 5 6 * 1 2 3 - 0 . = + ");

179

while(st.hasMoreTokens()) add(new Button(st.nextToken()));

setSize(200, 200); setVisible(true);

}

public static void main(String[] args){

Frame f= new GridTest(" Менеджер GridLayout"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.4. Розміщення кнопок менеджером GridLayout

11.4. Менеджер Card Layout

Менеджер розміщення СardLayout своєрідний - він показує в контейнері тілько один, перший (first), компонент. Решта компонентів лежить під першим у певному порядку як гральні карти в колоді. Їх розташування визначається порядком, в якому написані методи add(). Наступний компонент можна показати методом next (Container с), попередній - методом previous (Container с), останній - методом last (Container с), перший - методом first (Container с). Аргумент цих методов - посилка на контейнер, в який поміщені компоненти, звичайно this. В класі два конструктори:

СardLayout() — не відділяє компонент відт границь контейнера;

CardLayout(int hgap, int vgap) — задає горизонталне hgap і вертикальне vgap поля.

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

add(Component comp, Object constraints)

Тут аргумент constraints повинен мати тип String і містити імя компонента. Потрібний компонент з іменем name можна показати методом:

show(Container parent, String name)

В лістинзі 11.5 менеджер розміщення c1 працює з панеллю р, поміщеній в "центр" контейнера Frame. Панель р указується як аргумент parent в методах next() і show(). На "північ" контейнера Frame відправлена панель р2 з міткою в розкриваючому списку ch. Рис. 11.5 демонструє результат роботи програми.

Лістинг 11.5. Менеджер CardLayout

import java.awt.*; import java.awt.event.*;

class CardTest extends Frame{ CardTest(String s){

180

super(s);

Panel p = new Panel(); CardLayout cl = new CardLayout(); p.setLayout(cl);

p.add(new Button("Ukrainian page"),"page1"); p.add(new Button("English page"), "page2"); p.add(new Button("German page"), "pageЗ"); add(p);

cl.next(p); cl.show(p, "pagel");

Panel p2 = new Panel();

p2.add(new Label("Choice language:")); Choice ch = new Choice(); ch.add("Ukrainian"); ch.add("English");

ch.add("German");

p2.add(ch);

add(p2, BorderLayout.NORTH); setSize(400, 300); setVisible(true); }

public static void main(String[] args){

Frame f= new CardTest(" Менеджер CardLayout"); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.5. Менеджер розміщення CardLayout

11.5. Менеджер GridBagLayout

Менеджер розміщення GridBagLayout розставляє компоненти найбільш гнучко, дозволяючи задавати розміри і положення кожного компонента. Але він виявився досить складним і застосовуються рідко. В класі GridBagLayout єсть тільки один конструктор по замовчуванню, без аргументів. Менеджер класу GridBagLayout, на відміну від інших менеджерів розміщення, не містить правил розміщення. Він відіграє тільки організуючу роль. Йому передаються посилання на компонент і правила розташування цього компонента, а сам він поміщає даний компонент по вказаним правилам у контейнер. Всі правила розміщення компонентів задаються в обєкті іншого класу, GridBagConstraints. Менеджер розміщує компоненти в таблиці з невизначеним задалегідь числом рядків і стовпців. Один компонент може займати декілька клітинок цієї таблиі, заповнювати клітинку цілком, розташовується в її центрі, куті або притискується до краю клітинки. Класс GridBagConstraints містить одинадцять полів, визначаючих розміри компонентів, їх положення в контейнері і взаємне положення, і декілька констане - значень деяких полів. Вони перечислені в табл. 11.1. Ці параметры визначаються конструктором, що має одинадцять аргументів. Другий конструктор — конструктор по замовчуванню — присвоює параметрам значення,

181

задані по замовчуванню.

Таблиця 11.1. Поля класу GridBagConstraints

Поле

Значення

 

 

anchor

Напрям розміщення компонента в контейнері. Константи: CENTER, NORTH, EAST,

 

NORTHEAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, і NORTHWEST; пo

 

замовчуванню CENTER

 

 

fill

Розтягування компонента для заповнення клітинки. Константи: NONE, HORIZONTAL,

 

VERTICAL, BOTH; ПО умолчанию NONE

 

 

gridheight

Кількість клітинок в колонці, зайнятих компонентом. Ціле типу int, по замовчуванню 1.

 

Константа REMAINDER означає, що компонент займе решту колонки, RELATIVE —

 

буде наступним по порядку в колонкці

 

 

gridwidth

Кількість клітинок і рядку, зайнятих компонентом. Ціле типу int, по замовчуванню 1.

 

Константа REMAINDER означає, що компонент займе решту рядка, RELATIVE — буде

 

наступним в рядку по порядку

 

 

gridx

Номер клітинки в рядку. Сама ліва клітинка має номер 0. По замовчуванню константа

 

RELATIVE, що означає: наступна по порядку

 

 

gridy

Номер клітинки в стовпці. Сама верхня клітинка має номер 0. По замовчуванню

 

константа RELATIVE, що означає: наступна по порядку

 

 

insets

Поля в контейнері. Обєкт класу insets; по замовчуванню обєект з нулями

 

 

ipadx, ipady

Горизонтальные и вертикальные поля вокруг компонентов; по замовчуванню 0

 

 

weightx,

Пропорційний розтяг компонентів при зміні розміру контейнера; по замовчуванню 0,0

weighty

 

 

 

Як правило, обєкт класу GridBagConstraints створюється конструктором по замовчуванню, потім значення потрібних полів змінюються простим присвоєнням нових значень, наприклад:

GridBagConstraints gbc = new GridBagConstraints(); gbc.weightx = 1.0;

gbc.gridwidth = GridBagConstraints.REMAINDER gbc.gridheight =2;

Післяя створення обєкта gbc класу GridBagConstraints менеджеру розміщення указується, що при поміщенні компонента comp в контейнер належить застосовувати правила, занесені в обєкт gbc. Для цього застосовується метод

add(Component comp, GridBagConstraints gbc)

Отже, схема застосування менеджера GridBagLayout така:

Лістинг 11.6. Менеджер GridBagLayout

import java.awt.*; import java.awt.event.*;

class GridBagTest extends Frame{ GridBagTest(String s){ super(s);

GridBagLayout gbl = new GridBagLayout();

182

setLayout(gbl);

GridBagConstraints c = new GridBagConstraints(); Button b1 = new Button("Button1");

c.gridwidth = 2; add(b1,c);

Button b2 = new Button("Button2"); c.gridwidth = 1;

add(b2,c); setSize(400, 300); setVisible(true); }

public static void main(String[] args){

Frame f= new GridBagTest(" Менеджер GridBagLayout"); f.addWindowListener(new WindowAdapter(){

public void windowClosing(WindowEvent ev){ System.exit(0);

}

});

}

}

Рис. 11.6. Менеджер GridBagLayout

В документації до класу GridBagLayout приведений хороший приклад використання цього менеджера розміщення.

Заключення

Всі менеджери розміщення написані повністю мовою Java, в склад SUN J2SDK входять їх вихідні тексти. Якщо ви вирішили написати свій менеджер розміщення, реалізувавши інтерфейс LayoutManager або LayoutManager2, то подивіться ці вихідні тексти.

Лабораторна робота 10. Створення повноцінної Java програми з графічним інтерфейсом.

1.Візьміть за основу програму лістингу 11.4. Додайте в форму текстове вікно і запрограмуйте повноцінний калькулятор.

2.Додайте у форму ще декілька кнопок і запрограмуйте обчислення тригонометричних, обернених тригонометричних і інших елементарних функцій. Будьте готові до того, що викладач при прийомі роботи запропонує додати ще якусь кнопку - функцію.