МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Основні компоненти графічного інтерфейса
Методичні вказівки
до виконання лабораторної роботи №7
з курсу “Об’єктно-орієнтоване програмування”
для студентів базового напрямку
6.0804 “Комп’ютерні науки”
ЗАТВЕРДЖЕНО
на засіданні кафедри “Системи автоматизованого проектування” Протокол № 1від 30.08.2010
ЛЬВІВ 2010 Мова програмування Java. Методичні вказівки до виконання лабораторної роботи №7 “Принципи побудови графічного інтерфейса” з курсу: “Об’єктно-орієнтоване програмування” для студентів базового напрямку 6.0804 “Комп’ютерні науки”.
Укладачі: Каркульовський В.І., доцент, к.т.н.
Керницький А.Б., ст.викл., др.інж.
Відповідальний за випуск:
Рецензенти:
1. МЕТА РОБОТИ
Одержати навики побудови алгоритмів лінійних обчислювальних процесів, навчитися складати алгоритми та програмувати процеси з розгалуженням, циклами, ітераційними циклами за допомогою мови Java. Одержати навички роботи із масивами.
2.ОСНОВНІ ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. ОПЕРАТОРИ МОВИ JAVA
Графічна бібліотека AWT пропонує більше двадцати готових компонентів. Вони показані на рис. 8.2. Найбільш часто використовуються підкласи класу Component: класи Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextArea, TextField, Panel, ScrollPane, Window, Dialog, FileDialog, Frame. Ще одна група компонентів — це компоненти меню — класи Menuitem, MenuBar, Menu, PopupMenu, CheckboxMenuItem. Ми розглянемо їх в уроці 13. Забігаючи наперед, для кожного компонента перечислимо події, які в ньому відбуваються. Обробку подій ми розберемо в уроці 12. Почнемо вивчати ці компоненти від простих компонентів до складних і від найбільш часто використовуваних до використовуваних рідше. Але спочатку подивимося на те спільне, що єсть у всіх цих компонентах, а саме клас Сomponent.
10.1. Класс Component
Клас Сomponent — центр бібліотеки AWT — дуже великий і володіє багатьма можливостями. В ньому пять статичних констант, визначаючих розміщення компонента всередині простору, виділеного для компонента у вміщаючому його контейнері: BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT, і близько сотні методів. Більшість методів— це методи доступу getxxx(), isxxx(), setxxx(). Вивчати їх немає рації, треба просто подивитися, як вони використовуються в підкласах.
Конструктор класу недоступний — він захищений (protected), тому, що клас Сomponent абстрактний, він не може використовуватися сам по собі, використовуються лише його підкласи. Компонент завжди займає прямокутну область зі сторонами, паралельними сторонам екрана і в кожний момент часу має певні розміри, вимірювані в пікселях, які можна узнати методом getSize(), повертаючим обєкт класу Dimension, або цілочисельними методами getHeight() і getWidth(), повертаючими висоту і ширину прямокутника. Новий розмір компонента можна установити із програми методами setSize(Dimension d) або setSize(int width, int height), якщо це дозволяє менеджер розміщення контейнера, що містить компонент. У компонента єсть оптимальний розмір, при якому він виглядає найбільш пропорціонально. Його можна одержати методом getPreferredSize() у вигляді обєкта Dimension.
Компонент має мінимальний і максимальний розміри. Їх повертають методи getMinimumSize() і getMaximumSize() у вигляді обєкта Dimension. В компоненті єсть система координат. Її початок - точка з координатами (0, 0) - знаходиться в лівому верхньому куті компонента, вісь Ох іде вправо, вісь Оу - вниз, координатні точки розташовані між пікселями. В компоненті зберігаються координати його лівого верхнього кута в системі координат вміщаючого його контейнера. Їх можна узнати методами getLocation(), а зменити — методами setLocation(), перемістивши компонент в контейнері, якщо це дозволить менеджер розміщення компонентів.
Можна вияснити зразу і положення, і розмір прямокутної області компонента методом getBounds(), повертаючим обєкт класу Rectangle, і змінити разом і положення, і розмір компонента методами setBounds(), якщо це дозволить зробити менеджер розміщення. Компонент може бути недоступним для дій користувача, тоді він виділяється на екрані світло-сірим кольором. Доступність компонента можна перевірити логічним методом isEnabІed(), а змінити— методом setEnabled(boolean enable). Для багатьох компонентів визначається графічний контекст — обєкт класу Graphics, — який керується методом paint(), описаним в попередньому уроці, і який можна одержати методом getGraphics().
В контексті єсть поточний колір і колір фону — обєкти класу Сolor. Колір фону можна одержати методом getBackground(), а змінити— методом setBackground(Color color). Поточний колір можна одержати методом getForeground(), а змінити - методом setForeground(Color color). В контексті єсть шрифт — обєкт класу Font, що повертається методом getFont() і змінюється методом setFont(Font font). В компоненті визначається локаль — обєкт класу Locale. Його можна одержати методом getLocale(), змінити - методом setLocale(Locale locale).
В компоненті існує курсор, що показує положення миші, — обєкт класу Cursor. Його можна одержати методом getСursor(), змінюється форма курсора у "важких" компонентах за допомогою метода setСursor(Cursor cursor). Зупинимося на цих класах детальніше.
10.2. Клас Cursor
Основа класу — статичні константи, що визначають форму курсора:
CROSSHAIR_CURSOR — курсор у вигляді хреста, появляється при пошуку позиції для розміщення якогось елемента;
DEFAULT_CURSOR — звичайна форма курсора — стрілка вліво вверх;
HAND_CURSOR — "указуючий перст", появляється при виборі якогось елемента списку;
MOVE_CURSOR — хрест зі стрілками, появлється при переміщенні елемента;
TEXT_CURSOR — вертикальна риска, появляється в текстових полях;
WAIT_CURSOR — зображення годинника, появляється при очікуванні.
Наступні курсори появляються при наближенні до краю або кута компонента:
E_RESIZE_CURSOR — стрілка вправо з упором;
N_RESIZE_CURSOR — стрілка вверх с упором;
NE_RESIZE_CURSOR — стрілка вправо вверх, упираюча в кут;
NW_RESIZE_CURSOR — стрілка вліво вверх, упираюча в кут;
S_RESIZE_CURSOR — стрілка вниз з упором;
SE_RESIZE_CURSOR — стрілка вправо вниз, упираюча в кут;
SW_RESIZE_CURSOR — стрілка вліво вниз, упираюча в кут;
W_RESIZE_CURSOR — стрілка вліво з упором.
Перечислені константи являються аргументом type в конструкторі класу Cursor(int type). Замість конструктора можна звернутися до статичного методу getPredefinedCursor(int type), створюючому обєкт класу Cursor і повертаючому посилання на нього. Одержати курсор по замовчуванню можна статичним методом getDefauІtcursor(). Потім створений курсор треба установити в компонент. Наприклад, після виконання:
Cursor curs = new Cursor(Cursor.WAIT_CURSOR);
SomeComp.setCursor(curs);
при появі показчика миші в компоненті Somecomp показчик прийме вигляд годинника.
10.3. Як створити свій курсор
Крім цих наперед визначених курсорів можна задати свою власну форму курсора. Її тип носить назву CUSTOM_CURSOR. Сформувати свій курсор можна методом
createCustomCursor(Image cursor, Point hotspot, String name)
створюючим обєкт класу Сursor і повертаючим посилання на нього. Перед цим належить створити зображення курсора cursor — обєкт класу image. Як це зробити, розповідається в уроці 15. Аргумент name задає імя курсору, можна написати просто null. Аргумент hotspot задає точку фокуса курсора. Ця точка повинна бути в межах зображення курсора, точніше, в межах, показуваних методом
getBestCursorSize(int desiredWidth, int desiredHeight)
повертаючим посилання на обєкт класу Dimension. Аргументи методу означають бажаний розмір курсора. Якщо графічна система не допускає створення курсорів, повертається (0,0). Цей метод показує приблизно розмір того курсора, який створить графічна система, наприклад, (32, 32). Зображення cursor буде підігнано під цей розмір, при цьому можливі спотворення.
Третій метод— getMaximumCursorColors() — повертає найбільшу кількісь кольорів, наприклад, 256, яку можна використовувати в зображенні курсора. Це методи класу java.awt.Toolkit, з яким ми ще не працювали. Клас Toolkit містить деякі методи, звязуючі додатки Java із засобами платформи, на якій виконується додаток. Тому не можна створити екземпляр класу Toolkit конструктором, для його одержання належить виконати статичний метод Toolkit.getDefaultToolkit(). Якщо додаток працює у вікні Window або його розширеннях, наприклад, Frame, то можна одержати екземпляр Toolkit методом getToolkit() класу Window.
Зберемо все це разом:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
class SimpleFrame extends Frame{
SimpleFrame(String s){
super (s);
setSize(400, 150);
setVisible(true);
addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit (0);
}
});
Toolkit tk = Toolkit.getDefaultToolkit();
int colorMax = tk.getMaximumCursorColors(); // Найбільше число кольорів
Dimension d = tk.getBestCursorSize(50, 50); // d — розмір зображення
int w = d.width, h = d.height, k = 0;
Point p = new Point(0, 0); // Фокус курсора буде в його верхньому лівому куті
int[] pix = new int[w * h]; // Тут будуть пікселі зображення
for(int i = 0; i < w; i++) {
for(int j = 0; j < h; j++)
if (j < i) pix[k++] = 0xFFFF0000; // Лівий нижній кут - червоний
else pix[k++] = 0; // Правий верхній кут — прозорий
}
// Створюється прямокутне зображення розміром (w, h),
// заповнене масивом пікселів pix, з довжиною рядка w
Image im = createImage(new MemoryImageSource(w, h, pix, 0, w));
Cursor curs = tk.createCustomCursor(im, p, null);
setCursor(curs);
}
public static void main(String[] args){
new SimpleFrame(" Мy program");
}
}
В цьому прикладі створюється курсор у вигляді червоного прямокутного трикутника з катетами розміром 32 пікселі і установлюється в якомусь компоненті someComp.
10.4. Події
Подія ComponentEvent відбувається при переміщенні компонента, зміні його розміру, видаленні з екрана і появі на єкрані.
Подія FocusEvent відбувається при одержанні або втраті фокуса.
Подія KeyEvent проявляється при кожному нтисканні і звільнення клавіші, якщо компонент має фокус введення.
Подія MouseEvent відбувається при маніпуляцяях миші на компоненті.
Кожний компонент перед виведенням на екран поміщається в контейнер — підклас класу Сontainer. Познайомимося з цим класом.
10.5. Клас Container
Клас Сontainer — прямий підклас класу Сomponent, і наслідує всі його методи. Крім них основу класу складають методи додавання компонентів у контейнер:
add (Component comp) — компонент comp додається в кінець контейнера;
add (Component comp, int index) — компонент comp додається в позицію index в контейнері, якщо index == -1, то компонент додається в кінець контейнера;
add (Component comp, object constraints) — менеджеру розміщення контейнера даються вказівки обєктом Сonstraints;
add (String name. Component comp) —компонент отримує імя name.
Два методи видаляють компоненти із контейнера:
remove (Component comp) — видаляє компонент з іменем comp;
remove (int index) — видаляє компонент з індексом index в контейнері.
Один із компонентів в контейнері отримує фокус вводу (input focus), на нього направляється введення з клавіатури. Фокус можна переносити з одного компонента на інший клавішами <Tab> і <Shift>+<Tab>. Компонент може запросити фокус методом requestFocus() і передати фокус наступному компоненту методом transferFocus(). Компонент може перевірити, чи має він фокус, своїм логічним методом hasFocus(f). Це методи класу Component.
Для полегшення розміщення компонентів в контейнері визначається менеджер розміщення (layout manager) — обєкт, реалізуючий інтерфейс LayoutManager або його підінтерфейс LayoutManager2. Кожний менеджер розміщує компоненти в якомусь своєму порядку: один менеджер розставляє компоненти в таблицю, другий норовить розтягти компоненти по сторонах, третій просто розміщує їх один за другим, як слова в тексті. Менеджер визначає зміст слів "додати в кінець контейнера" і "додати в позицію index". В контейнері в будь-який момент часу може бути установлений тільки один менеджер розміщення. В кожному контейнері єсть свій менеджер по замовчуванню, установка іншого менеджера виконується методом setLayout(LayoutManager manager). Менеджери розміщення ми розглянемо детальніше в наступному уроці. В даному уроці ми будемо розміщувати компоненти вручну, відключивши менеджер по замовчуванню методом setLayout (null).
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent при додаванні і видаленні компонентів в контейнері відбувається подія ContainerEvent. Перейдемо до розгляду конкретних компонентив. Самий простий компонент описує клас Label.
10.6. Компонент Label
Компонент Label — це просто рядок тексту, оформлений як графічний компонент для розміщення в контейнері. Текст можна поміняти тільки методом доступу setText(String text), але не введенням користувача з клавіатури або за допомогою миші. Створюється обєкт цього класу одним із трьох конструкторів:
Label () — пустий обєкт без тексту;
Label (String text) — обєкт з текстом text, який притискується до лівого краю компонента;
Label (String text, int alignment) — обєкт з текстом text і визначеним розміщенням в компоненті тексту, задаваного однією із трьох констант: CENTER, LEFT, RIGHT.
Розміщення можна змінити методом доступу setAlignment(int alignment). Решта методів, крім методів, унаслідуваних від класу Сomponent, дозволяють одержати текст getText() і розміщення getAlignment().
Події
В класі Label відбуваються події класів Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent. Ненабагато складніший клас Button.
10.7. Компонент Button
Компонент Button — це кнопка стандартного для даної графічної системи вигляду з написом, здатна реагувати на клік кнопки миші — при натискуванні вона "вдавлюється" в площину контейнера, при відпусканні — становиться "випуклою". Два конструктори Button() і Button (String label) створюють кнопку без напису і з написом label відповідно. Методи доступа getLabel() і setLabel (String label) дозволяють одержати і змінити напис на кнопці. Головна функція кнопки — реагувати на клік миші, і інші методи класу обробляють ці дії. Ми розглянемо їх в уроці 12.
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при кліку на кнопку відбувається подія ActionEvent. Трохи складніший за клас Label клас Сheckbox, створюючий кнопки вибору.
10.8. Компонент Checkbox
Компонент Checkbox — це напис справа від невеликого квадратика, в якому в деяких графічних системах появляється галочка після кліку кнопкою миші — компонент переходить в стан (state) on. Після наступного кліку галочка пропадє — це стан off. В інших графічних системах стан on відмічається "вдавлюванням" квадратика. В компоненті Сheckbox стани on/off відмічаються логічними значеннями true/false відповідно.
Три конструктори Checkbox (), Checkbox(String label), Checkbox(String label, boolean state) створюють компонент без напису, з написом label в стані off, і в заданому стані state. Методи доступу getLabel(), setLabel (String label), getState(), setState (boolean state) повертають і змінюють ці параметри компонента. Компоненти Сheckbox зручні для швидкого і наочного вибору із списка, цілком розташованого на екрані, як показано на рис. 10.1. Там же продемонстрована ситуація, в якій потрібно вибрати тільки один пункт із декількох. В таких ситуаціях створюється група так званих радіокнопок (radio buttons). Вони помічаються кружком або ромбиком, а не квадратиком, выбір позначається жирною точкою в кружку або "вдавллюванням" ромбика.
Події
В класі Checkbox відбуваються події класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, а при зміні стану кнопки виникає подія ItemEvent. В бібліотеці AWT радіокнопки не створюють окремий компонент. Замість цього декілька компонентів Сheckbox обєднуються в группу за допомогою обєкту класу СheckboxGroup.
10.9. Клас CheckboxGroup
Клас CheckboxGroup дуже малий, оскільки його завдання — просто дати спільне імя всім обєктам Сheckbox, утворюючим одну групу. В нього входить один конструктор по замовчуванню CheckboxGroup() і два методи доступу:
getSelectedCheckbox(), повертаючий вибраний обєкт Checkbox;
setSelectedCheckbox (Checkbox box), задаючий вибір.
10.10. Як створити групу радіокнопок
Щоб організувати групу радіокнопок, треба спочатку сформувати обєкт класу CheckboxGroup, а потім створити кнопки конструкторами
Checkbox(String label, CheckboxGroup group, boolean state)
Checkbox(String label, boolean state, CheckboxGroup group)
Ці конструктори ідентичні, просто при запису конструктора можна не думати про порядок слідування його аргументів. Тільки одна радіокнопка в групі може мати стан state = true. Пора привести приклад. В лістинзі 10.1 приведена програма, поміщаюча в контейнер Frame дві мітки Label зверху, під ними зліва три обєкти Сheckbox, справа — групу радіокнопок. Внизу — три кнопки Button. Результат виконанняя програми показаний на рис. 10.1.
Лістинг 10.1. Розміщення компонентів
import java.awt.*;
import java.awt.event.*;
class SimpleComp extends Frame{
SimpleComp(String s){ super(s);
setLayout(null);
Font f = new Font("Serif", Font.BOLD, 15);
setFont(f);
Label L1 = new Label("Choose things:", Label.CENTER);
L1.setBounds(0, 50, 120, 30); add(L1);
Label L2 = new Label("Choose paying:");
L2.setBounds(160, 50, 200, 30); add(L2);
Checkbox ch1 = new Checkbox("Books");
ch1.setBounds(20, 90, 100, 30); add(ch1);
Checkbox ch2 = new Checkbox("Discs");
ch2.setBounds(20, 120, 100, 30); add(ch2);
Checkbox ch3 = new Checkbox("Tois");
ch3.setBounds(20, 150, 100, 30); add(ch3);
CheckboxGroup grp = new CheckboxGroup();
Checkbox chg1 = new Checkbox("Mail", grp,true);
chg1.setBounds(170, 90, 200, 30); add(chg1);
Checkbox chg2 = new Checkbox("Credit Card", grp, false);
chg2.setBounds(170, 120, 200, 30); add(chg2);
Button b1 = new Button("Continue");
b1.setBounds( 30, 220, 100, 30); add(b1);
Button b2 = new Button("Cancel");
b2.setBounds(140, 220, 100, 30); add(b2);
Button b3 = new Button("Exit");
b3.setBounds(250, 220, 100, 30); add(b3);
setSize(400, 300);
setVisible(true);
}
public static void main(String[] args){
Frame f = new SimpleComp (" Прості компоненти");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Рис. 10.1. Прості компоненти
Ми не програмували реакції на натискання кнопок, тому такі натискання не мають жодного ефекту. Відмітьте, що кожний створюваний компонент належить заносити в контейнер, в даному випадку Frame, методом add(). Лівий верхній кут компонента поміщається в точку контейнера з координатами, указаними першими двома аргументами методу setBounds(). Розмір компонента задається останніми двома параметрами цього методу. Якщо немає необхідності відображати весь список на екрані, то замість групи радіокнопок можна створити розкриваючийся список — обєкт класу Choice.
10.11. Компонент Choice
Компонент Сhoice — це розкриваючийся список, один, вибраний, пункт (item) якого видимий в полі, а інші появляються при кліку кнопкою миші на невелику кнопку справа від поля компонента. Спочатку конструктором Choice() створюється пустий список. Потім, методом add (String text), в список додаються нові пункти з текстом text. Вони розміщуються в порядку написання методов add() і нумеруються від нуля. Вставить новий пункт в потрібне місце можна методом insert (String text, int position). Вибір пункту можна зробити із програми методом select (String text) або select(int position). Видалити один пункт із списку можна методом remove(String text) або remove (int position), а всі пункти зразу — методом remove(). Число пунктів у списку можна узнати методом getІtemCount(). Вияснити, який пункт знаходиться в позиції pos можна методом getІtem(int pos), повертаючим рядок. Нарешті, визначення вибраного пункту виконується методом getSelectedIndex(), повертаючим позицію цього пункту, або методом getSelectedItem(), повертаючим виділений рядок.
Події
В класі Choice відбуваються події класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, а при виборі пункта відбувається подія ItemEvent. Якщо треба показати на екрані декілька пунктів списку, то створіть обєкт класу List.
10.12. Компонент List
Компонент List — це список із смугою прокрутки, в якому можна виділить один або декілька пунктів. Кількість видимих на екрані пунктів визначається конструктором списку і розміром компонента. В класі три конструктори:
List() — створює пустий список з чотирма видимими пунктами;
List (int rows) — створює пустий список з rows видимими пунктами;
List (int rows, boolean multiple) — створює пустий список в якому можна відмітити декілька пунктів, якщо multiple == true.
Після створення обєкта в список додаються пункти з текстом item:
метод add (String item) — додає новий пункт в кінець списку;
метод add (String item, int position) — додає новий пункт в позицію position.
Позиції нумеруются по порядку, починаючи з нуля. Видалити пункт можна методами
remove (String item), remove (int position), removeAll ().
Метод repІaceІtem(String newitem, int pos) дозволяє замінити текст пункта в позиції pos. Кількість пунктів у списку повертає метод getІtemСount(). Виділений пункт можна отримати методом getSelectedItem(), а його позицію — методом getSelectedlndex(). Якщо список дозволяє здійснювати множинний вибір, то виділені пункти у вигляді масиву типу String[] можнa одержати методом getSelectedІtems(), позиції виділених пунктів у вигляді масиву типу int[] — методом getSelectedlndexes(). Крім цих необхідних методів клас List містить багато інших, дозволяючих маніпулювати пунктами списку і отримувати його характеристики.
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при подвійному кліку кнопкою миші на вибраному пункті відбувається подія ActionEvent. В лістинзі 10.2 задаютсья компоненти, аналогічні компонентам лістинга 10.1, за допомогою класів Сhoice і List, а рис. 10.2 показує, як зміниться при цьому інтерфейс.
Лістинг 10.2. Використання списків
import java.awt.*;
import java.awt.event.*;
class ListTest extends Frame{
ListTest(String s){ super(s);
setLayout(null);
setFont(new Font("Serif", Font.BOLD, 15));
Label l1 = new Label("Choice things:", Label.CENTER);
l1.setBounds(0, 50, 120, 30); add (l1);
Label l2 = new Label("Choice paying mode:");
l2.setBounds(170, 50, 200, 30); add(l2);
List l = new List(2, true);
l.add("Books");
l.add("Discs");
l.add("Tois");
l.setBounds(20, 90, 100, 40); add(l);
Choice ch = new Choice();
ch.add("By mail transfer");
ch.add("By credit card");
ch.setBounds(170, 90, 200,30); add(ch);
Button b1 = new Button("Continue");
b1.setBounds( 30, 150, 100, 30); add(b1);
Button b2 = new Button("Cancel");
b2.setBounds(140, 150, 100, 30); add(b2);
Button b3 = new Button("Exit");
b3.setBounds(250, 150, 100, 30); add(b3);
setSize(400, 200); setVisible(true);
}
public static void main(String[] args){
Frame f = new ListTest("Прості компоненти");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
G
Рис. 10.2. Використання списків
10.13. Компоненти для введення тексту
В бібліотеці AWT єсть два компоненти для введення тексту з клавіатури: TextField, дозволяючий ввести тількb один рядок, і TextArea, в якому можна ввести декілька рядків. Обидва класи росширюють клас TextСomponent, в якому зібрані їх спільні методи, такі як виділення тексту, позиціювання курсора, одержання тексту.
10.13.1. Клас TextComponent
В класі TextComponent немає конструктора, цей клас не використовується самостійно. Основний метод класу — метод getText() — повертає текст, що знаходиться в полі введення, у вигляді рядка. Поле введення може бути нередагованим, в цьому стані текст в полі не можна змінити з клавіатури або мишкою. Узнати стан поля можна логічним методом isEditabІe(), змінити значення в ньому — методом setEditable(boolean editable). Текст, що знаходиться в полі, зберігається як обєкт класу String, тому у кожного символу єсть індекс (у першого — індекс 0). Індекс використовується для визначення позиції курсора (caret) методом getCaretPosition(), для установки позиції курсора методом setСaretРosition(int ind) і для виділення тексту. Текст виділяється мишею або клавішами зі стрілками при натисканні клавіші <Shift>, але можна виділити його із програми методом select(int begin, int end). При цьому помічається текст від символа з індексом begin включно, до символа з індексом end виключно. Весь текст виділяє метод selectAlІ(). Можна відмітити початок виділення методом setSelectionStart(int ind) і кінець виділення методом setSelectionEnd(int ind). Важливіше все-таки не задати, а отримати виделений текст. Його повертає метод getSeІectedText(), а початковий і кінцевий індекс виділення повертають методи getSelectionStart() і getSelectionEnd().
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при зміні тексту користувачем відбувається подія TextEvent.
10.13.2. Компонент TextField
Компонент TextField — це поле для введення одного рядка тексту. Ширина поля вимірюється в колонках (column). Ширина колонки — це середня ширина символу в шрифті, яким вводиться текст. Натискування клавіші <Enter> закінчує введення і служить сигналом до початку обробки введеного тексту, тобто при цьому відбувається подія ActionEvent. В класі чотири конструктори:
TextField() — створює пусте поле шириною в одну колонку;
TextField(int columns) — створює пусте поле з числом колонок columns;
TextField( String text) — створює поле з текстом text;
TextField(String text, int columns) — створює поле з текстом text i числом колонок columns.
До методів, унаслідуваних від класу TextComponent, додаються ще методи getColumns() і setColumns(int col). Цікава різновидність поля введення — поле для введення пароля. В такому полі замість введених символів появляється який-небудь особливий eхо-символ, частіше всього зірочка, щоб пароль ніхто не підглянув через плече. Дане поле введення одержується виконанням методу setEcnoCnar(char echo). Аргумент echo — це символ, який буде появлятися в полі. Перевірити, чи установлений ехо-символ, можна логічним методом echoCharisSet(), одержати ехо-символ — методом getEchoChar(). Щоб првернути поле введення в звичайний стан, достатньо виконати метод setEchoChar(0).
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при зміні тексту користувачем відбувається подія TextEvent, а при натисканні на клавішу <Enter> — подія ActionEvent.
10.13.3. Компонент TextArea
Компонент TextArea — це область введення з довільним числом рядків. Натискання клавіші <Enter> просто переводить курсор в початок наступного рядка. В області введення можуть бути установлені смуги прокрутки, одна або обидві. Основний конструктор класу
TextArea(String text, int rows, int columns, int scrollbars)
створює область введення з текстом text, числом видимих рядків rows, числом колонок columns, і заданням смуг прокрутки scrollbars однієї із чотирьох констант: SCROLLBARS_NONE, SCROLLBARS_HORIZONTAL_ONLY, SCROLLBARS_VERTICAL_ONLY, SCROLLBARS_BOTH. Решта конструкторів задають деякі параметри по замовчуванню:
TextArea (String text, int rows, int columns) — присутні обидві смуги прокрутки;
TextArea (int rows, int columns) — в полі пустий рядок;
TextArea (string text) — розміри устанавлює контейнер;
TextArea () — конструктор по замовчуванню.
Серед методів класу TextArea найбільш важливі методи:
append ( String text), додаючий текст text в кінець уже введеного тексту;
insert ( String text, int pos), вставляючий текст в указану позицію pos;
replaceRange (String text, int begin, int end), видаляючий текст починаючи з індекса begin включно по end виключно, і поміщаючий замість нього текст text.
Інші методи дозволяють змінити і отримати кількість видимих рядків.
Події
Крім подій класу Component: ComponentEvent, FocusEvent, KeyEvent, MouseEvent, при зміні тексту користувачем відбувається подія TextEvent.
В лістинзі 10.3 створюються три поля: tf1, tf2, tf3 для введення імені користувача, його пароля і замовлення, і не редагована область введення, в якій накопичується замовлення. В полі введення пароля tf2 появляється eхо-символ *. Результат показаний на рис. 10.3.
Лістинг 10.3. Поля введення
import java.awt.*;
import java.awt.event.*;
class TextTest extends Frame{
TextTest(String s){
super(s);
setLayout(null);
setFont(new Font("Serif", Font.PLAIN, 14));
Label l1 = new Label("Your Name:", Label.RIGHT);
l1.setBounds(20, 30, 70, 25); add(l1);
Label l2 = new Label("Password:", Label.RIGHT);
l2.setBounds(20, 60, 70, 25); add(l2);
TextField tf1 = new TextField(30) ;
tf1.setBounds(100, 30, 160, 25); add(tf1);
TextField tf2 = new TextField(30);
tf2.setBounds(100, 60, 160, 25);
add(tf2); tf2.setEchoChar('*');
TextField tf3 = new TextField("Input here your request", 30);
tf3.setBounds(10, 100, 250, 30); add(tf3);
TextArea ta = new TextArea("Your request:", 5, 50,
TextArea.SCROLLBARS_NONE);
ta.setEditable(false);
ta.setBounds(10, 150, 250, 140); add(ta);
Button b1 = new Button("Apply");
b1.setBounds(280, 180, 100, 30); add(b1);
Button b2 = new Button("Cancel");
b2.setBounds(280, 220, 100, 30); add(b2);
Button b3 = new Button("Exit");
b3.setBounds(280, 260, 100, 30); add(b3);
setSize(400, 300); setVisible(true);
}
public static void main(String[] args){
Frame f = new TextTest(" Поля введення");
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent ev){
System.exit(0);
}
});
}
}
Рис. 10.3. Поля введення
10.14. Компонент Scrollbar
Компонент Scrollbar — це смуга прокрутки, але в бібліотеці AWT клас Scrollbar використовується ще й для організації повзунка (slider). Обєкт може розміщатися горизонтально або вертикально, зазвичай смуги прокрутки розміщуються внизу і справа. Кожна смуга прокрутки охвачує деякий діапазон значень і зберігає поточне значення із цього діапазону. В лінійці прокрутки єсть пять елементів управління для переміщення по діапазону. Дві стрілки на кінцях лінійки викликають переміщення на одну одиницю (unit) у відповідному напрямі при кліку на стрілку кнопкою миші. Положення движка або бігунка (bubble, thumb) показує поточне