ЗНАЕТЕ ЛИ ВЫ?

Лабораторна робота №5 (Java. Типи даних.)



Лабораторна робота №5 (Java. Типи даних.)

 

Тема роботи: Java. Типи даних.

Мета роботи: Навчитися писати прості програми на Java 2SE .

 

План роботи

1. Ознайомитися з структурою JDK.

2. Ознайомитися з інтерфейсом програми IDEA.

3. Написати просту програму на мові Java 2SE

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

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

Java – об’єктно-орієнтована мова програмування. Це означає, що кожен біт і кожна змінна повинна зберігатись тільки в класі. Клас – це шаблон для екземплярів об`єкта. В Java майже все є об`єктами. Винятками є вісім простих типів даних:

byte;

short;

int;

long;

float;

double;

char;

boolean.

 

Перші чотири типи, byte, short, int та long, використовуються для представлення чисел з плаваючою комою. Наступні два типи, float і double, - для представлення чисел з плаваючою комою. Тип char служить для символів boolean – для представлення значення “true/false”.

На відміну від інших мов програмування, таких як C++, розмір простих типів даних в Java зафіксовано на рівні стандарту. Нижче в таблиці наводяться об`єм пам’яті, який займають прості типи і їх граничні значення.

 

Таблиця 1.Прості типи даних

Тип К-сть біт Найменше від’ємне значення Найбільше від’ємне значення Найменше позитивне значення Найбільше позитивне значення
Boolean - - - -
Short -32 768 -1
Char - -
Int -2 147 483 648 -1 2 147 483 647
Long -9 223 372 036 854 775 808 -1 9 223 372 036 854 775 807
Float -3,40282347 e+38 -1,40239846e-45 1,40239846e-45 3,40282347 e+38
double -1,797693134862 e+308 -4,94065645 841246544 e-324 4,94065645 841246544 e-324 1,797693134862 e+308

 

Слід звернути увагу, що в Java тип boolean може мати два значення “true” або “false”. На відміну від C++, ми не можемо змінній типу boolean присвоїти яке-небудь ціле число.

 

Необхідно також враховувати той факт, що в Java числа представлені у вигляді двійкового додаткового коду. Це може привести до несподіваних результатів.

Наприклад, ми маємо змінну типу byte:

byte x = 127. Що ми отримаємо в результаті додавання +1 до x? Правильна відповідь: -128. Значення 127 є найбільшим позитивним значенням, яке може зберігатись в змінній типу byte. В результаті додавання одиниці ми отримаємо найменше від’ємне число. Таке явище називається верхнім переповненням цілочисельної змінної.

Більш складні типи даних – масиви.

Для створення масиву необхідно:
- оголосити масив – задати тип елементів, котрі будуть зберігатись в масиві і присвоїти йому ім’я;
- виділити для масиву пам’ять – задати кількість його елементів;
- ініціалізувати масив, помістивши в його елементи необхідні дані.

 

Приклад:
short theCounter[] = new short[10];
float aSetOfFloats = {3.14159, 2.171828} – створення масиву і його ініціалізація.

Оператори керування кодом програми.

Оператори if, if-else.

Для виконання програми з різними умовами в Java використовуються логічні оператори: if , if-else, switch.

Оператор if в Java має такий синтаксис:
if (логічний-вираз)

На відміну від C, C++, де результат виразу в дужках може мати тип int, в Java вимагається, щоб вираз мав тип boolean. Це захищає програміста від найбільш поширених помилок.

 

Аналогічно до більшості мов програмування, Java підтримує також оператор if-else:
if(логічний-вираз)

else

Якщо при виконанні оператора if або else необхідно передати керування групі операторів, то необхідно використовувати складний оператор, обрамлений круглими дужками:

if(i>0)

{
//виконати певні дії …

}
else

Оператори switch.

Припустимо, програмі необхідно передати керування одній із віток, в залежності від виконання ряду умов. Це можна реалізувати з допомогою наступного коду:
if(Умова1)

{
doThis();
}

else if (Умова2)
{

doThat();
}

else if (Умова3)
{

doSomethingElse();

}

 

Наведений код не вирізняється простотою. Його можна замінити таким чином, щоб умова перевірки була ціле число:
switch(theTestCodition)
{
case 0: doThis();
break;

case 1: doThat();
break;

case 2: doSomethingElse();

break;

default: doThedefauktThink();

}

 

Оператори циклу

В будь-якій мові програмування повинні бути передбачені оператори, котрі б дозволяли виконати ітераційні процедури або цикли. В Java підтримується три оператори циклу: while, do-while і for.

Якщо задані дії необхідно виконати нуль або більше разів – необхідно використати оператор while.

Якщо задані дії необхідно виконати хоча б один раз – необхідно використати оператор do-while.

 

Приклад оператора while:
int x[]=new int[10];
int i=0;
while(i<10)
{
x[i] = i*i;

System.out.println(“x=”,x);
i++;

}

 

Приклад оператора do-while:
int x[]=new int[10];
int i=0;
do
{
x[i] = i*i;

System.out.println(“x=”,x);
i++;

} while(i<10)

 

Приклад оператора for:
int x[]=new int[10];
for(int i=0;i<10;i++)
{
x[i] = i*i;

System.out.println(“x=”,x);
}

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

1) Ознайомитися з IDEA.

2) Ознайомитися з jdk.

3) Навчитися запускати IDEA ("C:\Program Files\JetBrains\IntelliJ IDEA 7.0.3\bin\idea.exe") та підключати jdk (C:\Program Files\Java\jdk1.6.0_06\).

4) Написати наступну просту програму та запустити її:

Public class Lab1

{

public static void main(String[] args)

{

System.out.println("Hello World");

}

}

5) Модифікувати програму так, щоб вона виводила 10 раз ваше ім'я, прізвище та порядковий номер.

Приклад:

1) Романчук Василь

2) Романчук Василь

3) Романчук Василь

4) ……..

6) Написати наступну просту програму, яка виводить вікно:

public class Lab1_1 extends JFrame

{

 

public Lab1_1()

{

setTitle("Work #3");

setSize(300,300);

setVisible(true);

}

 

public static void main(String[] args)

{

new Lab1_1();

}

}

 

7) Модифікувати програму таким чином: замінити назву віна на свою фамілію.

8) Зробити висновки.

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

10) Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер лабораторної роботи, k – номер програми.

 

 

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

1) Що таке клас?

2) Що таке об’єкт?

3) Які прості типи даних використовуються в мові Java 2SE?

4) Конструкція оператора умовного розгалуження if?

5) Конструкція оператора умовного розгалуження if-else?

6) Конструкція оператора умовного розгалуження switch.

 


Лабораторна робота №6 (Знайомство з динамічними масивами)

 

Тема роботи:Знайомство з динамічними масивами.

Мета роботи: Навчитися писати програми з використанням динамічних масивів.

План роботи

1. Ознайомитися з інтерфейсами та їх властивостями: Collection, List, Set.

2. Ознайомитися з класами: ArrayList, HeshSet, TreeSet.

3. Модифікувати програми для класів ArrayList, HeshSet, TreeSet згідно свого варіанту

4. Ознайомлення з колекціями класів, визначених програмістом.

5. Доробити програму з колекціями класів, визначених програмістом.

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

В Java 2 було запропоновано одне із найбільш цікавих доповнень – колекції. Структура колекцій стандартизує спосіб, з допомогою якого ваші програми обробляють групи об’єктів. В попередніх версіях Java для збереження і маніпулювання даними служили класи Dictionary, Vector, Stack і Properties. Хоча ці класи були досить корисними, відчувалась нестача уніфікованого, централізованого підходу при роботі з групами об’єктів. Наприклад, спосіб використання класу Vector відрізнявся від використання класу Properties.

Інтерфейси колекцій

Нагадаємо, інтерфейс – це набір функцій, котрі повинні бути реалізовані (визначені) в класі.

Інтерфейс Collection.

Інтерфейс Collection – основа, на якій формується структура колекцій. В ньому оголошуються методи, котрі визначаються всіма колекціями.

Основні методи колекцій:

boolean add(Object obj) Додає obj до колекції. Повертає true, якщо obj був доданий до колекції, і false якщо obj уже був доданий до колекції і якщо колекція не допускає дублікатів
void clear() Видаляє всі елементи із колекції
boolean contains(Object obj) Повертає true, якщо колекція містить obj, false – якщо ні
Iterator iterator() Повертає ітератор (iterator) для колекції
boolean remove(Object obj) Видаляє один екземпляр obj із колекції. Повертає true якщо елемент був видалений і false - якщо ні
int size() Повертає кількість елементів, котрі містяться в колекції
Object toArray() Повертає масив, котрий містить всі елементи колекції

 

Об’єкти додаються в колекцію з допомогою методу add(). Зверніть увагу, що add() отримує аргумент типу Object. Оскільки Object – суперклас для всіх класів, в колекції можна зберігати об’єкт будь-якого типу. Однак, примітивні типи зберігати не можна.

Для видалення об’єктів служить метод remove().

Інтерфейс List.

Цей інтерфейс доповнює Collection і визначає поведінку колекції, котра зберігає послідовність елементів. Елементи можуть бути вставлені або отримані із колекції з допомогою їх позиції в списку, котра відраховується від нуля.

 

Методи інтерфейсу List.

void add(int index, Object obj) Вставляє obj в колекцію в позицію з індексом index. Будь-які елементи, котрі існували раніше в точці вставки або вище неї будуть зсунуті (тобто елементи не перезаписуються поверх існуючих)
Object get(int index) Повертає об’єкт, котрий зберігається в позиції index
int indexOf(Object obj) Повертає індекс першого екземпляру obj. Якщо obj не знайдено – повертається -1
Object remove(int index) Видаляє елемент із позиції index. В результаті список ущільнюється (тобто, індекси наступних елементів зменшуються на 1)
Object set(int index) Встановлює об’єкт obj в позиції під номером index

Інтерфейс Set.

Цей інтерфейс повторює інтерфейс Collection і оголошує поведінку колекції, котра не допускає дублювання елементів. Тому метод add() повертає false, якщо здійснюється спроба додати в набір дублюючі елементи.

Класи колекцій

Це класи – котрі реалізують вищезгадані інтерфейси, тобто реалізовують всі методи.

Клас ArrayList.

Цей клас реалізує інтерфейс List. ArrayList підтримує динамічні масиви, котрі можуть рости по мірі необхідності. В Java стандартні масиви мають фіксовану довжину. Після того, як масиви створені, вони не можуть розширюватись або зменшуватись, це означає, що ви наперед повинні знати, скільки елементів буде знаходитись у масиві. Але, інколи, ви не можете до моменту виконання точного розміру масиву. Саме для цього і служить клас ArrayList.

 

Приклад 1.

import java.util.ArrayList;

 

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

ArrayList al = new ArrayList();

System.out.println("Starting size of al: "+al.size());

//додаємо елементи в масив

al.add("C");

al.add("A");

al.add("B");

al.add("D");

al.add("C");

al.add("F");

al.add(1,"A2");

System.out.println("Size of al after add : "+al.size());

 

//показати на екрані список масиву

System.out.println("al consists of : "+al);

 

//видалити елементи із списку

al.remove("F");

al.remove(2);

 

System.out.println("Size of al after removing : "+al.size());

 

//показати на екрані список масиву

System.out.println("al consists of after removing : "+al);

}

}

Клас HashSet.

Цей клас реалізує інтерфейс Set. Він створює колекцію, котра використовує хеш-таблицю для збереження колекції. Перевага використання такої таблиці в тому, що для великих масивів зберігається постійним час виконання основних операцій, таких, як add(), remove(), size().

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

Приклад 2.

import java.util.HashSet;

 

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

HashSet hs = new HashSet();

//додаємо елементи в масив

hs.add("C");

hs.add("A");

hs.add("B");

hs.add("D");

hs.add("C");

hs.add("F");

//показати на екрані список масиву

System.out.println("hs consists of : "+hs);

}

}

 

Клас TreeSet.

Цей клас теж реалізує інтерфейс Set, але на відміну від класу HasSet, об’єкти в ньому зберігаються в відсортованому вигляді.

Приклад 3.

import java.util.TreeSet;

public class Lab2

{

public static void main(String[] args)

{

//створюємо динамічний масив

TreeSet ts = new TreeSet();

//додаємо елементи в масив

ts.add("C");

ts.add("A");

ts.add("B");

ts.add("D");

ts.add("C");

ts.add("F");

//показати на екрані список масиву

System.out.println("ts consists of : "+ts);

}

}

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

1. Виконайте всі наведені приклади.

2. До масиву ArrayList() добавити об'єкти A, C, D, R, T та пояснити результат( в низу програми в коментарях.

3. До масиву HashSet() добавити об'єкти A, C, D, R, T та пояснити результат( в низу програми в коментарях.

4. До масиву TreeSet() добавити об'єкти A, C, D, R, T та пояснити результат( в низу програми в коментарях.

5. Поясніть чому в прикладі 4 об’єкт new Address("Hrabovskyy", "21 Chereshneva Str., Lviv") не буде доданий до набору.

6. Видрукуйте всі елементи на екрані, користуючись методами size(), get(index) з допомогою циклу for.

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

8. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер лабораторної роботи, k – номер програми.

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

1. Який клас дозволяє дублювання елементів в колекції?

2. Який клас створює колекцію, котра використовує хеш-таблицю для збереження колекції. Перевага використання такої таблиці в тому, що для великих масивів зберігається постійним час виконання основних операцій, таких, як add(), remove(), size().

3. Скільки об'єктів можна створити з одного класу?

4. Чи можна добавити об'єкт у масив ArrayList у визначену позицію?

5. Який масив впорядковує елементи колекції?

6. Які методи інтерфейс Collection успадковує від інтерфейсу List, а які перевизначає?


План роботи

1. Ознайомлення з компонентами бібліотеки Swing.

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

3. Ознайомитися з методикою обробки подій в Java.

4. Виконати задані приклади.

 

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

Для реалізації графічного інтерфейсу користувача в Java був створений пакет компонентів Swing. Число компонентів Swing досить велике, тому нижче наводяться основні класи. Всі видимі компоненти Swing походять від базового класу java.swing.JComponent і тому наслідують всі властивості та методи цього класу.

 

Контейнери найвищого рівня

Контейнери найвищого рівня – класи, котрі можуть включати в собі інші контейнери або компоненти.


JDialog – діалогове вікно.

 


JFrame – контейнер “Вікно”.

 

Ці контейнери можуть включати в себе контейнери загального користування і контроли.

 


Основні контроли.


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

JCheckBox – цей компонент дозволяє вибрати одне із можливих значень “так” або “ні”, JRadioButton – елемент управління для формування групи, у якій можна вибрати тільки один елемент,

JButton – стандартна кнопка Windows, може відображати текст і/або значок.


JList

 


JComboBox


JMenuBar

 


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

JtextArea – компонент, котрий може відображати текст, який складається із кількох рядків, JeditorPane – компонент для редагування/відображення HTML або RTF текстів

Приклад 1.

 

import javax.swing.*;

import java.awt.*;

 

public class Lab3 extends JFrame

{

public Lab3()

{

setTitle("Work #3");

setSize(300,300);

getContentPane().setLayout(new FlowLayout());

 

JLabel label = new JLabel("simple label");

getContentPane().add(label);

 

JButton button = new JButton("Press me");

getContentPane().add(button);

 

setVisible(true);

}

 

public static void main(String[] args)

{

new Lab3();

}

}

 

Пояснення:
public Lab3() – конструктор класу Lab3, при цьому Lab3 є підкласом JFrame.

setTitle("Work #3") – задає титул даного вікна;

setSize(300,300) – задає розмір вікна;

getContentPane().setLayout(new FlowLayout()) – задаємо спосіб компонування компонентів на основній панелі вікна (значення FlowLayout буде пояснене в наступній лабораторній роботі) JLabel label = new JLabel("simple label") – створюємо об’єкт класу Jlabel (напис), котрий містить текст “simple label”;

getContentPane().add(label) – додаємо новостворену компоненту label до основної панелі вікна;

JButton button = new JButton("Press me") – створюємо компонент JButton (кнопка) із написом “Press me”;

getContentPane().add(button) – додаємо кнопку до основної панелі;

setVisible(true) – показуємо наше вікно на екрані;

 

new Lab3() – створюємо новий об’єкт, тобто виконуємо все те, що вказано в його конструкторі.

 

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

 

Обробка подій.

Сучасний підхід до обробки подій грунтується на моделі делегування подій. Ця концепція проста: джерело генерує подію і передає її одному або декільком блокам-слухачам (listener) подій. Отримавши подію слухач обробляє її і потім повертає управління. Перевага даного підходу в тому, що логіка обробки подій відділені від інтерфейсу користувача.

Подія – це об’єкт, котрий описує зміну стану джерела. Він може бути згенерований взаємодією користувача ПК з елементами в графічному інтерфейсі користувача.

Джерело події – об’єкт, котрий генерує подію. Генерація події відбувається тоді, коли якимсь-чином змінюється внутрішній стан об’єкта. Джерело може генерувати декілька типів подій. Для того, щоб блоки-слухачі могли приймати повідомлення, джерело повинно зареєструвати ці блоки. Кожен тип подій має власний тип реєстрації. Загальна форма таких методів:
public void addMouseListener(MouseListener l).

 

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

Найважливіші інтерфейси та їх методи:

 

Інтерфейс ActionListener
метод:
void actionPerformed(ActionEvent ae) – метод викликається коли настає action-подія, наприклад, користувач натискає мишкою на кнопці або написі.

 

Інтерфейс ComponentListenet
методи:

void componentResized(ComponentEvent ce);
void componentMoved(ComponentEvent ce);
void componentShown(ComponentEvent ce);
void componentHidden(ComponentEvent ce) : методи викликаються коли компонент змінюється в розмірах, переміщуються, відображається на екрані або стає невидимим.

 

Інтерфейс MouseListener
методи:
void mouseClicked()– якщо кнопка мишки натискається і відразу ж відпускається;
void mouseEntered() – якщо вказівник мишки входить в межі компонента;
void mouseExited()– якщо вказівник мишки виходить за межі компонента;
void mousePressed() – якщо кнопка мишки натискається;
void mouseReleased() – якщо кнопка мишки відпускається.

 

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

1. Помістіть програмно вікно Lab3 по центру екрану.

Для цього отримайте розміри екрану:
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height.

Помістіть вікно з допомогою методу:
setBounds(int x, int y, int width, int hight).

Додайте ці методи в конструкторі класу Lab3() перед методом setVisible().

2. Змініть клас Lab3MouseMoution таким чином, щоб при переміщенні мишки над вікном координати мишки виводились на написі label.

3. При натисканні на кнопку "Press me" нічо не відбувається зробіть так, щоб виводилося повідомленн "Press me" в консольне меню.

4. Зробіть так, щоб при натисканні на кнопку "Press me" виводилося повідомлення "Press me" в label.

5. Додати ще один об’єкт типу Jlabel, додайте клас-слухач таким чином, щоб на написі відображались координати вікна та його розмір.

6. Назвіть вікно своєю фамілією.

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

8. Прикріпити до VNS файл [Ваша Фамілія].zip в архіві повинно бути файли програм [Ваша Фамілія]_labN_k.class ,a також файли звіту [Ваша Фамілія]_Zvit_LabN.mdb, де N – номер лабораторної роботи, k – номер програми.

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

1. Для чого призначений компонент JtextField?

2. Поясніть термін контейнери найвищого рівня?

3. Метод якого слухача викликається коли настає action-подія, наприклад, користувач натискає мишкою на кнопці або написі.

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

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

6. Який з класів відноситься до контейнерів найвищого рівня?


План роботи

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. На малюнку показано приклад застосування даного компонувальника:

 

Приклад 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

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

 

Приклад 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);

}

}

 

Компонувальник 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);

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.*;

 

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);

}

}

 

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

 

В конструкторі 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");

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()

{

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);

}

}

 

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

GridBagLayout є найбільш гнучким і разом з тим найбільш складним в платформі Java. Він дозволяє розміщувати компоненти у виляді сітки із рядів і колонок. При цьому компоненти можуть займати декілька рядків або колонок. Також колонки можуть мати різну ширину, а рядки різну висоту. При цьому для визначення висоти і ширини комірки приймається до уваги найоптимальніший розмір компонента. Цей розмір отримується функцією getPrefferedSize(). Його також можна задати для кожного компонента з допомогою функції setPrefferedSize(Dimension dim).

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

 

Якщо ми збільшимо вікно, як показано на малюнку, то побачимо, що нижній ряд, де знаходиться Button 5, займає весь новий вертикальний простір. Новий горизонтальний простір ділиться між всіма колонками. Така поведінка компонентів задається параметрами GridBagLayout. Слід відмітити, що кожен компонент займає весь можливий горизонтальний простір, але не весь можливий вертикальний простір (як можна бачити у Button 5). Ця поведінка теж задається в програмі.

 

Для того, щоб задати поведінку кожного компонента, ми повинні задати для кожного із них свої констрейнти (contraints). Констрейнт – це об’єкт класу GridBagConstraints. При додаванні компонента до контейнера, ми повинні вказати констрейнт для кожного компонента.

 

Наприклад:

 

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);

 

Нижче пояснюється значення кожної змінної класу 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





Последнее изменение этой страницы: 2016-04-26; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.239.51.78 (0.14 с.)