PОЗДІЛ 2 ТЕОРЕТИЧНІ ВІДОМОСТІ МОВИ ПРОГРАМУВАННЯ JAVA 5 страница

[public] interface ИмяІнтерфейса [extends СписокІнтерфейсів]

Приклад інтерфейсу:

public interface Product

{

static final String MAKER = “Cisco Corp.”;

static final String Phone = “555-123-4567”;

public int getPrice(int id );

}
Ще один реальний приклад інтерфейсу з пакета java.applet:

public interface AudioClip

{ /** Starts playing the clip.

Each time this method is called,

the clip is restarted from the beginning. */

void play();

/** Starts playing the clip in a loop.

*/

void loop();

/** Stops playing the clip.

*/

void stop();

}
Як бачимо, основна задача інтерфейса – об’являти абстрактні методи, які будуть реалізовані в інших класах.
Зазначимо, що інтерфейси також можна розширяти, створюючи нащадків від вже існуючих інтерфейсів, наприклад:
interface Monitored extends java.lang.Runnable, java.lang.Clonable

{

boolean IsRunning();

}
В класі, що реалізує інтерфейс, мають бути перевизначені всі методи, які були об’явлені в інтерфейсі, інакше клас буде абстрактним. Звичайно, в класі можуть бути присутні інші, власні методи, не описані в інтерфейсах. Приклад класу, що реалізує інтерфейс:

class Shoe implements Product

{ public int getPrice(int id)

{

if (id==1) return 5;

else return 10;

}

public String getMaker()

{

return MAKER;

}

}
Розглянемо найбільший і, напевно, самий корисний розділ мови Java, зв'язаний з реалізацією користувацького інтерфейсу. Для цього необхідно вивчити базові класи пакету java.awt (Abstract Window Toolkit), представлені на рисунку 2.3.

TextComponent
TextField
TextArea
Container
Panel
Window
Frame
Dialog
File Dialog
Applet
Component
Canvas  
List
Label
Button
Checkbox
Choice
Scrollbar
Menu Component
MenuBar
MenuItem
Menu
CheckboxMenuItem

 


Рисунок 2.3 – Ієрархія класів пакету java.awt

Отже, що ж таке awt? Це набір класів Java, кожний з яких відповідає за реалізацію функцій і відображення того чи іншого елемента графічного інтерфейсу користувача (GUI). Практично всі класи візуальних компонентів є нащадками абстрактного класу Component. Лише візуальні елементи меню успадковуються від іншого класу – MenuComponent. Керуючі елементи представлені такими класами: Button (кнопка), Checkbox (кнопка з неза­леж­ною фіксацією), Choice (список Windows), Label (рядок), List (список вибору Windows) і Scrollbar (смуга прокручування). Це досить прості класи, успадковані від абстрактного класу Component безпосередньо.

Однак у складі java.awt є класи інтерфейсних елементів, що мають проміжного пращура. Гарним прикладом тому є клас Panel для створення різних панелей. У нього є проміжний абстрактний клас-пращур Container, що слугує родоначальником багатьох класів-контейнерів, здатних містити в собі інші елементи інтерфейсу. Від цього ж класу успадковується клас вікна Window, що представляє на екрані найпростіше вікно без меню і рамки. У цього класу є два часто використовуваних нащадки: Dialog, назва якого говорить сама за себе, і Frame – стандартне вікно Windows. Ще один проміжний клас TextComponent породжує два корисних у роботі класи – TextField (аналог рядка введення Windows) і багаторядкове вікно текстового введення TextArea. Особняком від всіх елементів стоїть клас Canvas. Його візуальне представлення – порожній квадрат, на якому можна виконувати малювання і який може обробляти події натиснення кнопок миші.

Від свого батьківського класу Component всі візуальні елементи переймають загальну для них усіх поведінку, пов'язану з їх візуальною та функціональною сторонами. Наведемо список основних функцій, що їх виконують всі компоненти, та методів для їх реалізації (таблиця 3):

 

Таблиця 2.3

Основні методи класу Component

Назва методу Функціональне призначення
getFont() setFont() getFontMetrics() визначає або встановлює шрифт компонента
setForeground() getForeground() установлення і зчитування кольору компонента
setBackground() getBackground() установлення і зчитування кольору тіла компонента
preferredSize() minimumSize() повертають менеджеру розкладок інформацію про кращий і мінімальний розміри компонента, відповідно
resize() size() встановлює і визначає розміри компонента
show() hide() показує та приховує компонент
isVisible() isShowing() повертає true, якщо компонент відображений, і значення false, якщо компонент прихований
disable() enable() забороняє або дозволяє компонент
isEnable() повертає true, якщо компонент дозволений
paint() update() repaint() відображення компонента
handleEvent() action() обробка повідомлень
keyDown() keyUp() обробка повідомлень клавіатури

Label (Текст):

За допомогою класу Label можна створювати текстові рядки у вікні Java-програм і аплетів. Для створення об’єкту цього типу існують три види конструкторів:

Label(); // створюється пустий рядок

Label(String str); // надпис, вирівняний вліво

Label(String str, int align); // надпис із заданим вирівнюванням

де змінна align може приймати три значення: Label.LEFT, Label.CENTER, Label.RIGHT.
Найбільш корисні методи класу Label наведено в таблиці 4.

Таблиця 2.4

Основні методи класу Label

SetText(String str) змінює текст в рядку
setAlignment(int align) змінна вирівнювання
String getText() повертає текст рядка
int getAlignment() повертає значення вирівнювання

Приклад.

Label MyLabel1 = new Label(“Надпис по центру”, Label.CENTER);

Label MyLabel2 = new Label(“Вирівняний вліво”);

Button (Кнопка):

Клас Button представляє на екрані кнопку. У цього класу є два типи конструктора. Перший з них створює кнопку без надпису, другий – з надписом:

Button(); // кнопка без тексту на ній

Button(String str); // кнопка із текстом на ній


Корисні методи:

setLabel() – створити або замінити надпис на кнопці;

getLabel() – дізнатись про надпис на кнопці.
Обробка кнопок. При натисненні на кнопку викликається метод action():

public boolean action(Event evt, Object wA);
де evt – подія, яка відбулася (evt.target – до якого об’єкту відноситься подія, evt.when – час виникнення події, ...);
wA – текст надпису на кнопці.
Приклад:

...

public class Example1 extends Applet

{

public void init()

{

add(new Button(“Red”);

add(new Button(“Green”);

}

public Boolean action(Event e, Object wA)

{

if (!(e.target instanceof Button))

// перевіряємо, чи натиснуто якусь кнопку

return false;

if ((String) wA = “Red”) // яку саме кнопку?

setBackground(Color.red);

else

setBackground(Color.green);

return true;

Checkbox (Прапорець та Перемикач):
Клас Checkbox відповідає за створення і відображення кнопок з не­за­леж­ною фіксацією. Це кнопки, що мають два стани: "увімкнене" і "вим­к­не­не". Клік на такій кнопці приводить до того, що її стан міняється на проти­лежний. В початковий момент прапорець скинутий (тобто має стан false).

Якщо розмістити кілька кнопок з незалежною фіксацією в середині елемента класу CheckboxGroup, то замість них ми одержимо кнопки з залежною фіксацією – перемикачі (radio button), тобто групу кнопок, серед яких у той самий момент може бути включено тільки одну. Якщо натиснути будь-яку кнопку з групи, то раніше натиснуту кнопка буде відпущено (це нагадує радіоприймач, в якому одночасно може працювати тільки одна програма).
Конструктори:

Checkbox(); // прапорець без тексту

Checkbox(String str); // прапорець з текстом

Checkbox(String str, CheckboхGroup group, boolean initState);

/* прапорець з текстом, що належить групі (якщо створюється саме прапорець, а не перемикач, то цей параметр повинен мати значення null */
Корисні методи наведено в таблиці 2.5.

Таблиця 2.5

Основні методи класу Checkbox

boolean getState() метод класу Checkbox, що повертає статус прапорця
getCurrent() метод класу CheckboxGroup, повертає перемикач, який в даний момента включений
SetCurrent() встановлює активну кнопку перемикача (для класу CheckboxGroup)
setLabel() getLabel() встановлює або повертає текст при прапорці або перемикачі

Обробка перемикачів та прапорців. При натисканні мишею по прапорцю або перемикачу викликається метод action(), другий параметр якого wA є об’єктом класу boolean, який має значення true, якщо прапорець встановлено, і false – в протилежному випадку.
Приклад.
import java.awt.*;
import java.applet.*;
public class ExCheckbox extends Applet {

Checkbox rbBlue, rbWhite;

CheckboxGroup gr;

public void init() {

add (new Checkbox("Red"));

add (new Checkbox("Green"));

gr = new CheckboxGroup();

Checkbox rbBlue = new Checkbox("Blue",gr,true);

Checkbox rbWhite = new Checkbox("White",gr,false);

add(rbBlue);

add(rbWhite);

}

public boolean action(Event e, Object wA) {

if (e.target instanceof Checkbox)

{

Checkbox cur = (Checkbox) e.target;

if (cur.getLabel() == "Red" && cur.getState())

setBackground(Color.red);

if (cur.getLabel() == "Green" && cur.getState())

setBackground(Color.green);

if (cur.getLabel() == "Blue" && cur.getState())

setBackground(Color.blue);

if (cur.getLabel() == "White" && cur.getState())

setBackground(Color.white);

return true;

}

return false;

}

}
Choice (Список, що розкривається):

Коли потрібно створити список, що розкривається, можна вдатися до допомоги класу Choice. Створити його можна за допомогою конструктора
Choice();
Корисні методи класу Choice наведено в таблиці 2.6:

Таблиця 2.6

Основні методи класу Choice

addItem(String str) Додати елемент в список
select(int n) Вибрати рядок з визначеним номером
select(String str) Вибрати визначений рядок тексту зі списку
int countItems() повернути кількість пунктів у списку
int getSelectIndex() повертає номер вибраного рядка (нумерація починається з 0)
String getItem(int n) повернути рядок з визначеним номером у списку
String getItem() повернути вибраний рядок

Обробка списків, що розкриваються. При виборі елемента списку викликається метод action(), другий параметр wA якого містить в собі назву вибраного елемента.
Приклад.
import java.awt.*;
import java.applet.*;
public class ExChoice extends Applet
{ Choice ch;

public void init()

{ ch=new Choice();

ch.addItem("Red");

ch.addItem("Green");

ch.addItem("Blue");

ch.addItem("White");

add(ch);

}

public boolean action(Event e, Object wA)

{

if (e.target instanceof Choice)

{

Choice cur = (Choice) e.target;

switch (cur.getSelectedIndex()) {

case 0: setBackground(Color.red); break;

case 1: setBackground(Color.green); break;

case 2: setBackground(Color.blue); break;

case 3: setBackground(Color.white); break;

} return true;

} return false;

}

}

List (Список):

Клас List (список) за призначенням дуже схожий на клас Choice, але надає користувачу не такий список, що розкривається, а вікно зі смугами прокручування, в середині якого знаходяться пункти вибору. Будь-який з цих пунктів можна вибрати подвійним щигликом або, вказавши на нього мишею, натиснути клавішу <Enter>. Причому можна зробити так, що стане можливим вибір декількох пунктів одночасно.
Корисні методи класу List наведено в таблиці 2.7.

Таблиця 2.7

Основні методи класу List

addItem(String str) додати рядок до списку;
addItem(String str, int index) вставити рядок в список в позицію index (якщо index = -1, то додається в кінець списку);
replaceItem(String str, int index) замінити елемент вибору в зазначеній позиції
delItem(int index) видалити зі списку визначений пункт
delItems(int start, int end) видалити елементи вибору з номерами, що входять в інтервал від номера start до номера end;
getItem(int n) текст пункту вибору
clear() очистити список (знищити всі елементи списку відразу)
select(int n) виділити пункт із визначеним номером
deselect(int n) зняти виділення з визначеного пункту
isSelected(int n) повернути значення true, якщо пункт із зазначеним номером виділений, інакше повернути false
countItems() порахувати кількість пунктів вибору в списку
getRows() повернути кількість видимих у списку рядків вибору
getSelectedIndex() довідатися порядковий номер виділеного пункту; якщо повертається -1, те обрано кілька пунктів (метод для списків І типу)
getSelectedItem() прочитати текст виділеного пункту вибору (для списків І типу);
int[] getSelectedIndexes() повернути масив індексів виділених пунктів (для списків ІІ типу);
String[] getSelectedItems() повернути масив рядків тексту виділених пунктів (для списків ІІ типу)
allowsMultipleSelections() повернути true, якщо список дозволяє множинний вибір
setMultipleSelections() включити або виключити режим дозволу множинного вибору
makeVisible(int n) зробити елемент із визначеним номером видимим у вікні списку
getVisibleIndex() повернути індекс елемента вибору, що останнім після виклику методу makeVisible() став видимим у вікні списку

Створення об'єкта класу List може відбуватися двома способами. Ви можете створити порожній список і додавати в нього пункти, викликаючи метод addItem(). При цьому розмір списку буде рости при додаванні пунктів. Інший спосіб дозволяє відразу обмежити кількість видимих у вікні списку пунктів. Інші пункти вибору можна побачити, прокрутивши список.
Конструктори:

List (); // список для вибору тільки одного параметра

List (int row, boolean mult); // створення списку, в якому

// row – кількість елементів, які можна одночасно

// бачити, mult – дозвіл вибіру більше одного ел-та

Обробка списків. Клас List не використовує метод action(). Замість нього використовується метод
handleEvent(Event evt);
де evt.id – статична константа, що приймає одне з двох значень:
LIST_SELECT – елемент вибраний;
LIST_DESELECT – не вибраний;
evt.arg – змінна, яка містить індекс вибраного елемента.
Приклад.
import java.awt.*;
import java.applet.*;
public class ExList extends Applet

{ List ch;

public void init()

{ ch=new List();

ch.addItem("Red");

ch.addItem("Green");

ch.addItem("Blue");

ch.addItem("White");

ch.addItem("Cyan");

add(ch);

}

public boolean handleEvent(Event e)

{ if (e.target == ch)

{ if (e.id==Event.LIST_SELECT)

{

Integer sel=(Integer) e.arg;

switch (sel.intValue())

{

case 0: setBackground(Color.red); break;

case 1: setBackground(Color.green); break;

case 2: setBackground(Color.blue); break;

case 3: setBackground(Color.white); break;

case 4: setBackground(Color.cyan); break;

}

}

return true;

}

return false;

}

}

Два родинних класи, TextField і TextArea, які успадковують властивості класу TextComponent, дозволяють відображати текст із можливістю його виділення і редагування. По своїй суті це маленькі редактори: однорядковий (TextField) і багаторядковий (TextArea). Створити об'єкти цих класів дуже просто: потрібно лише передати розмір у символах для класу TextField і розмір у кількості рядків і символів для класу TextArea:

Конструктори:
TextField(); // пустий рядок невизначеної довжини

TextField(int); // пустий рядок вказаної довжини
TextField(String); // рядок з попередньо визначеним текстом
TextArea(); // пусте поле введення невизначених розмірів
TextArea(int, int); // пусте поле визначених розмірів
TextArea(String); // поле з попередньо визначеним текстом
TextArea(String, int, int); // поле з текстом заданих/ розмірів
Корисні методи класів TextField і TextArea наведено в таблиці 2.8.

Таблиця 2.8

Основні методи класів TextField і TextArea

Спільні методи для обох класів
getText() зчитати текст
setText(String) відобразити текст;
select(int, int) виділити текст між початковою і кінцевою позиціями;
selectAll() виділити весь текст
getSelectedText() прочитати виділений текст;
SetEditable(Boolean) заборонити редагування тексту
isEditable() перевірити, чи дозволене редагування тексту
getSelectionStart() повернути позицію початку виділення
getSelectionEnd() повернути позицію закінчення виділення
getColumns() повернути кількість видимих символів у рядку редагування (не довжина рядка!)

Обробка повідомлень текстового рядка та текстового поля. Як і клас List, клас TextArea не використовує метод action(). Оскільки події цього класу – це події клавіатури і миші, тому краще створити додаткову кнопку, яку користувач міг би натиснути, вказуючи, що введення завершено. Після цього можна застосувати метод getText() для отримання результату введення і редагування.

Для класу TextField також краще застосувати додаткову кнопку. Хоча може бути використаний і метод action(), але тільки тоді, коли користувач натискає клавішу <Enter>.
Для того щоб керувати розташуванням елементів всередині вікон-контейнерів, у Java існує менеджер розкладок (layout manager). Від нього успадковуються п'ять класів, що визначають той чи інший тип розташування компонентів користувацького інтерфейсу у вікні. Коли вам потрібно змінити тип розташування, ви створюєте той чи інший клас розкладки, що відповідає вашим вимогам, і передаєте його у викликуваний метод setLayout(), що змінює поточну розкладку:
setLayout(new BorderLayout());
FlowLayout (послідовне розташування) - це найпростіший спосіб розташування елементів один за одним, застосовуваний за замовчуванням. Коли в одному рядку вже не вміщуються нові елементи, заповнення продовжується з нового рядка.
Конструктори:

FlowLayout(); // розкладка з вирівнюванням рядків по центру

FlowLayout(int align); // розкладка з заданим вирівнюванням

FlowLayout(int align, int horp, int verp); // розкладка з вирівнюванням

// і завданням проміжків між елементами по

// горизонталі та вертикалі

Параметр align може приймати одне з значень:

FlowLayout.LEFT, FlowLayout.RIGHT, FlowLayout.CENTER.

 

GridLayout розташовує елементи один за іншим усередині деякої умовної таблиці. Всі елементи будуть однакового розміру. Розмір комірок можна програмно змінювати.

Конструктори:
GridLayout(int nRows, int nCols); // задає розкладчик з вказаною

// кількістю рядків і стовпців

GridLayout(int nRows, int nCols, int horp, int verp);

// задає розкладчик з вказаною кількістю рядків і стовпців і

//величиною проміжків між елементами (в пікселах)
Якщо задано кількість рядків, то кількість стовпчиків буде розра­хо­вано, і навпаки. Якщо треба створити розкладчик з заданим числом рядків, то кількість стовпців треба вказати 0. Якщо ж треба задати кількість стовпців, то замість кількості рядків слід задати 0. Таким чином, виклик GridLayout(3, 4) еквівалентний виклику GridLayout(3, 0).
BorderLayout (полярне розташування) - розділяє контейнер на 5 областей і розміщає елементи або поруч з обраним краєм вікна, або в центрі. Для цього після установки BorderLayout додавання елементів у вікно-контейнер виконується методом add() з додатковим параметром, що задається рядками “North”, “South”, “East”, “West” і “Center”. Таким чином, даний розкладчик розділяє контейнер на п’ять областей.
Конструктори:

BorderLayout(); // розкладчик без проміжків між елементами

BorderLayout(int horp,verp); // розкладчик з проміжками між

// елементами

Даний розкладчик не дозволяє додавати в одну область більше одного компонента. Якщо додано більше одного компонента, то буде видно лише останній.
Метод add() має для даного розкладчика матиме такий вигляд:

add(int poz, Component comp);

де poz означає той край вікна, до якого необхідно пригорнути елемент, що вставляється (“North”, “South”, “East”, “West” і “Center”).
CardLayout (блокнотне розташування). При розкладці цього типу елементи розміщаються один за іншим, як карти в колоді (в кожний момент часу видно тільки один елемент). Звичайно такий розклад зручний, якщо нам необхідно динамічно змінювати інтерфейс вікна. Крім того, ми можемо робити елементи, що знаходяться один над іншим по черзі. Створюються вкладки, вміст яких відображається при натисканні кнопки миші на заголовку.
GridBagLayout (коміркове розташування). Це мудрована, але в той же час і сама потужна розкладка. Вона розташовує елемент в умовній таблиці, як це робиться у випадку з GridLayout. Але на відміну від останньої, можна варіювати розмір кожного елемента окремо. Правда, прийдеться набрати додатково не один рядок вихідного тексту. Для кожного елемента задають власні “побажання”. Ці побажання вміщуються в об’єкт GridBagConstraints, який містить такі змінні:

gridx, gridy – координати комірки, куди буде розміщений наступний компонент. За замовчуванням gridx = gridy = GridBagConstraint.RELATIVE, тобто для gridx це означає ко­мір­ку праворуч від останнього доданого елемента, для gridy – комірка знизу;

gridwidth, gridheight – кількість комірок, яку обіймає компонент по гори­зон­талі і вертикалі. За замовчуванням – 1. Якщо gridwidth = GridBag­Constraint.REMAINDER або gridheight = GridBagConstraint. EMAINDER, то компонент буде передостаннім в рядку (у стовпці). Якщо компонент повинен бути розташований у рядку або у стовпці, слід задати GridBag­Const­raint.RELATIVE; fill – повідомляє, що робити, якщо компонент менший, ніж виділена комірка. Він може приймати значення:

GridBagConstraint.NONE (за замовчуванням) – лишає розмір без змін;

GridBagConstraint.HORIZONTAL – розтягує компонент по горизонталі,

GridBagConstraint.VERTICAL – розтягує компонент по вертикалі,

GridBagConstraint.BOTH – розтягує по горизонталі і по вертикалі;

ipadx, ipady – вказує, скільки пікселів додати до розмірів компонент по гори­зонталі та вертикалі з кожної сторони (за замовчуванням дорівнює 0);

insets – екземпляр класу Insets – вказує, скільки місця лишити між границями компонента і краями комірки (тобто “демаркаційна лінія” навколо компонента), містить окремі значення для верхнього, нижнього, лівого і правого проміжків;

anchor – використовується коли компонент менший за розміри комірки.
Може приймати значення:

GridBagConstraint.СЕNTER (за замовчуванням), GridBagConstraint.NORTH, GridBagConstraint.NORTHEAST,GridBagConstraint.EAST, GridBagConstraint.SOUTHEAST, GridBagConstraint.SOUTH, GridBagConstraint.SOUTHWEST,

GridBagConstraint.WEST, GridBagConstraint.NORTHWEST;