Поделиться Поделиться

Weidhtx, weighty – задають відносні розміри компонентів

Класи . Говорячи про класи, необхідно ще раз пригадати один з трьох основних принципів ООП – успадкування. Використовуючи його, можна створити головний клас, який визначає властивості, спільні для набору елементів. Надалі цей клас може бути успадкований іншими, більш специфічними класами. Кожен з них додає ті властивості, які є унікальними для нього. В термінології Java клас, який успадковується, називається суперкласом (superclass). Клас, який виконує успадкування, називається підкласом (subclass). Тому підклас – це спеціалізована версія суперкласу. Він успадковує всі поля та методи суперкласу, та додає до них свої власні унікальні елементи. Щоб успадкувати клас, необхідно просто ввести визначення одного класу в інше, використовуючи ключове слово extends. Модифікатори доступу.

Модифікатори визначають способи подальшого використання класу. При розробці самого класу вони не мають особливого значення, але вони ду­же важливі при створенні інших класів або інтерфейсів на базі даного класу.

Модифікаторів доступу є три плюс ще один за замовчуванням.

public – класи public доступні для всіх об’єктів незалежно від пакета, тобто повністю не захищені. public-класи мають знаходитися в файлах з іменами, що збігаються з іменами класів.

friendly –значення за замовчуванням (тобто слово friendly в описі класу ніколи не пишеться!). friendly-класи доступні лише для об’єктів, що знаходяться в тому ж самому пакеті, що і даний клас, незалежно від того, чи є вони нащадками даного класу.

final- класи не можуть мати підкласів-нащадків. Тим самим ми втра­ча­ємо одну з головних переваг ООП. Але іноді треба заборонити іншим класам змінювати поведінку розроблюваного класу (наприклад, якщо даний клас буде використаний як стандарт для обслуговування мережних комунікацій).

abstract – це клас, в якому є хоча б один абстрактний метод, тобто метод, для якого описаний лише заголовок (прототип функції), а саме тіло методу відсутнє. Зрозуміло, що реалізацію цього відсутнього методу покла­де­но на класи-нащадки. Наприклад, створюється деякий клас для перевірки орфографії. Замість того, щоб закладати в нього перевірку української, ро­сійської, англійської орфографії, створюючи методи ukraineCheck(), russi­an­Check() і т. д. можна просто створити абстрактний метод grammarCheck(), перекладаючи роботу щодо перевірки конкретної граматики на класи-нащадки (які, можливо, будуть створені іншими фахівцями).

  1. Пакети класів, їх створення та використання.

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

Щоб внести клас в пакет, необхідно скористатися оператором package, наприклад:

package game;

При цьому необхідно витримати дві умови:

1. Вихідний текст класа має знаходитись в тому ж каталозі, що і інші файли пакета (тобто цей каталог треба попередньо створити).

2. Оператор package має бути першим оператором в файлі.

Якщо файл є частиною пакета, справжнє ім’я класа складається з імені пакета, крапки та імені класа. Тому, якщо Ви внесли клас Animator в пакет game, щоб імпортувати його слід вказати повне ім’я класу: import game.Animator;

Якщо ж вам необхідно використати в своїй програмі декілька класів з пакета game і ви не бажаєте імпортувати кожен клас окремо, виписуючи всі їх імена, ви можете імпортувати весь пакет, отримавши доступ одразу до всіх класів даного пакета: import game.*;

І на сам кінець. Навіть нічого не імпортуючи, ви можете отримати доступ до деякого класу з пакету, вказуючи його повне ім’я при об’яві екземпляра класу: game.Animator a;

  1. Поняття про інтерфейси. Реалізація інтерфейсів.

Інтерфейси – це варіант множинного успадкування, яка є в C++, але відсутня в Java. Іншими словами, клас в Java не може успадкувати поведінку одразу кількох класів, але може реалізовувати одразу декілька інтерфейсів. Також клас може бути одночасно і нащадком одного класу, і реалізовувати один або кілька інтерфейсів.

В чому відмінність інтерфейсів від класів? Класи описують об’єкт, а інтерфейси визначають набір методів і констант, які реалізуються іншим об’єктом. Інтерфейси мають одне головне обмеження: вони можуть описувати абстрактні методи та поля final, але не можуть мати жодної реалізації цих методів. В прикладному відношенні інтерфейси дозволяють програмісту визначити деякі функціональні характеристики, не турбуючись про те, як потім ці характеристики будуть описані.

Наприклад, якщо деякий клас реалізує інтерфейс java.lang.Runnable він має містити метод run(). Тому java-машина може «всліпу» викликати метод run(), для будь якого Runnable-класу. Неважливо, які дії він при цьому виконує – важливо, що він є. Реалізація інтерфейсів

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

class Shoe implements Product

{ public int getPrice(int id)

{

if (id==1) return 5;

else return 10;

}

public String getMaker()

{

return MAKER;

}

}

Зверніть увагу на ключове слово implements (реалізація), яке з’явилось в заголовку класу на відміну від звичного extends.

  1. Використання рядків в мові Java. Клас String.

Кожен рядок, створювана за допомогою оператора new або за допомогою літерала (укладена в подвійні апострофи), є об'єктом класу String. Особливістю об'єкта класу String є те, що його значення не може бути змінено після створення об'єкту за допомогою якого методу класу, так як будь-яка зміна рядка приводить до створення нового об'єкта. При цьому посилання на об'єкт класу String можна змінити так, щоб вона вказувала на інший об'єкт і тим самим на інше значення.

Клас String підтримує кілька конструкторів, наприклад: String (), String (String str), String (byte asciichar []), String (char [] unicodechar), String (StringBuffer sbuf), String (StringBuilder sbuild) та ін Ці конструктори використовуються для створення об'єктів класу String на основі ініціалізації значеннями з масиву типу char, byte і ін Наприклад, при виклику конструктора

new String (str.getChars (), "UTF-8"),

де str - рядок у форматі Unicode, можна встановити необхідний алфавіт за допомогою регіональної кодування в якості другого параметра конструктора, в даному випадку кирилицю. Коли Java зустрічає літерал, укладений у подвійні лапки, автоматично створюється об'єкт типу String, на який можна встановити посилання. Таким чином, об'єкт класу String можна створити, присвоївши посиланні на клас значення існуючого літерала, або за допомогою оператора new і конструктора

  1. Менеджери розташування. Їх призначення та використання

Розкладки

Для того щоб керувати розташуванням елементів всередині вікон-контейнерів, у 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 розташовує елементи один за іншим усередині деякої умовної таблиці. Всі елементи будуть однакового розміру. Розмір комірок можна програмно змінювати.

Конструктори:

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;

weidhtx, weighty – задають відносні розміри компонентів.

10. Використання компонентів користувацького інтерфейсу. 11. Реалізація користувацького інтерфейсу. Використання кнопок

Наведена програма потребує розлогих коментарів. На самому початку необ­хід­но імпортувати пакет java.awt, оскільки саме в ньому знаходяться кла­си, що визначають елементи інтерфейсу користувача, і пакет java.awt. event, в якому містяться класи обробки подій.

Головний клас Square (принагідно нагадаємо, що текст програми має знаходитися в файлі саме з цим ім’ям і розширенням java: Square.java) ми зробили нащадком класу Frame. Це дуже важливе рішення, оскільки воно в значній мірі визначає всі подальші дії. Отже, які саме переваги дає такий вибір? По-перше, клас Frame має візуальний еквівалент у вигляді вікна, тобто вміє представляти себе на екрані. По-друге, це вікно вміє реагувати на деякі події миші, змінюючи розміри та положення на екрані, а також згор­таючись та розгортаючись. На жаль, воно не вміє закриватися, а це означає, що цьому нам його доведеться навчити. По-третє, клас Frame, як нащадок класу Container, дозволяє вставляти в себе елементи користувацького інтерфейсу (кнопки, поля введення тощо), з якими буде безпосередньо працювати оператор. Наш клас Square успадковує всі ці візуальні та функ­ціональні властивості від класу Frame як його безпосередній нащадок.

Окрім цього, клас Square реалізує інтерфейс ActionListener. Нагадаємо, що в ньому міститься метод actionPerformed(), на який передається управління при натисканні кнопки. Отже, всі необхідні дії, пов’язані з перевіркою чисел, будуть знаходитися саме в цьому методі.

Опис класу починається з оголошення змінних. Ці змінні (поля класу) будуть доступними з будь-якого методу класу. Вони відповідають основним елементам користувацького інтерфейсу: полям введення чисел і кнопці Check. Змінна displayStr призначена для виведення відповіді.

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

Конструктор починається з виклику конструктору суперкласу. Для звертання до будь-якого батьківського класу в Java використовується ім’я super. Отже, вираз

super("Check Square");

означає звертання до конструктора класу Frame. Як параметр йому передається рядок – заголовок вікна.

Метод setSize() встановлює розміри вікна (в попередніх версіях Java для цього використовувався метод resize()). Наступний крок – вибір класу розкладки для управління розташуванням елементів користувацького інтер­фейсу. Ми вибираємо найпростіше послідовне розташування, це означає, що елементи будуть розташовані послідовно зліва направо та згори донизу. Після цього можна перейти безпосередньо до створення елементів і вставляння їх в контейнер за допомогою метода add(). При створенні кнопки button1 одразу за допомогою методу addActionListener() реєструємо блок прослуховування події. Це необхідно для того, щоб відповідний метод отримав управління при натисненні кнопки. Інший підхід, який базується на використанні адаптера WindowAdapter ми застосуємо для обробки події закриття вікна для завершення роботи програми. Наприкінці конструктора за допомогою метода show() ми виводимо на екран наше вікно програми разом з усіма елементами користувацького інтерфейсу.

Метод main() дуже простий – в ньому створюється клас програми за до­помогою конструктора Square(). Якщо зараз завершити процес розробки програми, скомпілювати її та виконати, ми побачимо вікно, наведене на рисунку 4. Зрозуміло, що необхідна функціональність поки що відсутня, але зовнішній вигляд програми вже цілком відповідає умовам задачі.

Наступний метод actionPerformed() викликається при натисненні на кнопку. Як параметр йому передається об’єкт evt класу ActionEvent, який несе повну інформацію про подію, що відбулася. Спочатку за допомогою ме­тоду getActionCommand() ми отримуємо рядок, що містить інформацію про джерело події у вигляді рядка (тобто в цей момент arg дорівнює "Check"). Далі за допомогою методу equals() класу String, ми перевіряємо, чи дійсно натиснено саме кнопку "Check", а не іншу. Далі ми отримуємо інформацію з текстових полів – спочатку за допомогою методу getText() у вигляді рядка, а потім за допомогою статичного методу parseInt() класу Integer – у вигляді цілого числа. Далі формується відповідь – рядок displayStr. Для його ви­ве­дення на екран слугує метод paint(). Відзначимо, що метод paint() напряму не викликається. Якщо необхідно обновити інформацію у вікні, програма викликає метод repaint(), а вже він передає управління методу paint().

Такий спосіб виведення використовується винятково з метою озна­йомлення з різними можливостями щодо виведення інформації. Простіше це було б зробити, виводячи відповідь в третє текстове поле.

  1. Пакет java.awt. Ієрархія класів в ньому. Клас Component.

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

Weidhtx, weighty – задають відносні розміри компонентів - Инвестирование - 1


Рисунок 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):

Таблиця 3 – Основні методи класу Component

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

Контейнери

Будь-який з компонентів, що вимагає показу на екрані, повинний бути доданий у клас-контейнер. Контейнери служать сховищем для візуальних компонентів інтерфейсу й інших контейнерів. В awt визначено такі контейнери:

- вікно (Window);

- панель (Panel);

- фрейм (Frame);

- діалогове вікно (Dialog).

Навіть якщо в аплеті явно не створюється контейнер, він все рівно буде використовуватися, оскільки клас Applet є похідним від класу Panel.

Найпростіший приклад контейнера – клас Frame, об'єкти якого відображаються на екрані як стандартні вікна з рамкою.

Щоб показати компонент користувацького інтерфейсу у вікні, потрібно створити об'єкт-контейнер, наприклад, вікно класу Frame, створити необхідний компонент і додати його в контейнер, а вже потім відобразити його на екрані. Незважаючи на настільки довгий список дій, у вихідному тексті цей процес займає усього кілька рядків.

Таблиця 9 – Основні методи класу Container

add() додавання елемента інтерфейсу у вікно контейнера
add(Component, int) передаються порядковий номер, куди буде встав­ле­но елемент, і посилання на об'єкт
add(String,Component) посилання на об'єкт, що вставляється. Рядків, припустимих як перший аргумент, всього п'ять: North, South, East, West і Center
getComponent(int) повертає посилання на компонент (повертає тип Component) за заданим індексом
getComponents() повертає масив Component[] всіх елементів даного контейнера
countComponent() повертає кількість компонентів у контейнері
remove() видалення конкретного елемента
removeAll(). метод видалення усіх візуальних компонентів
  1. Загальні характеристика класу Component (див 13)

клас Component забезпечує методи для додавання та вилучення блоків прослуховування подій клавіатури та миші.

  1. Використання контейнера Panel та основні його методи.

Панель

Клас Panel (панель) - це простий контейнер, у який можуть бути додані інші контейнери чи елементи інтерфейсу. Звичайно він використовується в тих випадках, коли необхідно виконати складне розміщення елементів у вікні Java-програми й аплета. При цьому панель може бути включена в склад інших контейнерів.

Конструктор:

Panel();

Панель може містити в собі декілька інших панелей, тобто їх можна вкладати одна в одну.

Приклад.

Panel mainPanel, suPanel1, subPanel2;

sainPanel = new Panel();

subPanel1 = new Panel();

subPanel2 = new Panel();

mainPanel.add(subPanel1);

mainPanel.add(subPanel2);

add(mainPanel);

  1. Контейнер Frame, його особливості.

Frame (Фрейми)

Одним з найважливіших класів користувацького інтерфейсу можна вважати клас Frame. За його допомогою реалізуються вікна для Java-програм і аплетів. На відміну від інших класів користувацького інтерфейсу, екземпляри класу Frame створюються рідко. Їх використовують для створення окремих додатків. Звичайно від нього успадковується новий клас, а вже потім створюється екземпляр нового класу:

public class NewWindow extends Frame

{

TextArea output;

public NewWindow (String title)

{

super(title);

}

...

public static void main (String args[])

{

// Створення екземпляра нового класу

NewWindow win = new NewWindow("New Window Class");

// Показати його на екрані

win.show();

}

}

Корисні методи класу Frame наведено в таблиці 10.

Таблиця 10 – Основні методи класу Frame

pack() змінити розмір компонентів у вікні так, щоб їхній розмір був максимально наближений до бажаного
getTitle() повернути заголовок вікна
setTitle(String) встановити заголовок вікна
getIconImage() повернути піктограму вікна
setIconImage(Image) встановити піктограму вікна
getMenuBar() повернути об'єкт меню вікна
setMenuBar(MenuBar) встановити меню вікна
remove(MenuComponent) забрати визначений компонент із меню вікна
isResizable() повернути true, якщо розмір вікна можна змінювати, інакше – false
setResizable(boolean) дозволити зміна розмірів вікна
getCursorType() повернути поточний тип курсору миші для вікна
setCursor(int) встановити тип курсору миші для вікна: Frame.DEFAULT_CURSOR, Frame.CROSSHAIR_CURSOR, Frame.TEXT_CURSOR, Frame.WAIT_CURSOR, Frame.HAND_CURSOR, ...
  1. Графічні засоби мови Java. Клас Canvas.

Особняком від всіх елементів стоїть клас Canvas. Його візуальне представлення – порожній квадрат, на якому можна виконувати малювання і який може обробляти події натиснення кнопок миші.

Weidhtx, weighty – задають відносні розміри компонентів - Инвестирование - 2

  1. Реалізація роботи прапорців та пермикачів.

Checkbox (Прапорець та Перемикач)

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

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

Конструктори:

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

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

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

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

Корисні методи наведено в таблиці 5.

Таблиця 5 – Основні методи класу Checkbox

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

Обробка перемикачів та прапорців. При натисканні мишею по прапорцю або перемикачу викликається метод action(), другий параметр якого wA є об’єктом класу boolean, який має значення true, якщо прапорець встановлено, і false – в протилежному випадку.

  1. Клас Graphics. Малювання графічних примітивів.

Насправді метод getImage() не завантажує зображення через мережу, як це може здаватися. Він тільки створює об’єкт Image. Реальне завантаження файла растрового зображення буде виконуватися методом рисування drawImage(), який належить класу Graphics. Варіанти цього методу (не всі):

public abstract boolean drawImage(Image img, int x, int y,

ImageObserver observer);

public abstract boolean drawImage(Image img, int x,int y,

int width, int height, ImageObserver observer);

Перший параметр – посилання на об’єкт класу Image, який отримано раніше за допомогою getImage(). Далі x та y – координати лівого верхнього кута прямокутного регіону, в якому буде виводитись зображення. Якщо для рисування обрано метод drawImage() з параметрами width (ширина) та height (висота), зображення буде виведено з масштабуванням. Зверніть увагу! Помноживши ці параметри на коефіцієнти, можна розтягнути (стиснути) зображення по горизонталі та вертикалі.Параметр observer – це посилання на об’єкт класу ImageObserver, який отримає звістку при завантаженні зображення. Звичайно таким об’єктом є сам клас, тому цей параметр вказується як this.

Коли викликається метод drawImage() зображення ще може бути не завантажено. Оскільки процес завантаження по мережі – досить тривалий та не передбачуваний в часі, необхідно передбачити якісь засоби для контролю над цим процесом. Принаймні когось треба повідомити, коли зображення вже буде повністю завантажено, що і робиться в цих методах. Можна виводити зображення по мірі готовності, можна дочекатися повного завантаження, а вже потім виводити на екран.

Метод getGraphics() дозволяє отримати позаекранний контекст зображення для рисування зображення не у вікні додатка або аплета, а в оперативній пам’яті:

public abstract Graphics getGraphics();

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

  1. Виведення тексту. Клас Font.

Шрифт – об'єкт класу Font – окрім імені, стилю і розміру має ще півтора десятки атрибутів: підкреслення, перекреслювання, нахил, колір шрифту і колір фону, ширину і товщину символів, аффінне перетворення, розташування зліва направо або справа наліво.

Атрибути шрифту задаються як статичні константи класу TextAttribute. Найбільш використовувані атрибути перераховані в таблиці 14.

На жаль, не всі шрифти дозволяють задати всі атрибути. Подивитися список допустимих атрибутів для даного шрифта можна методом getAvailableAttHbutes() класу Font. Атрибути шрифтів

Атрибут Значення
BACKGROUND Колір фону. Об'єкт, що реалізовує інтерфейс Paint
FOREGROUND Колір тексту. Об'єкт, що реалізовує інтерфейс Paint
BIDI_EMBEDDED Рівень вкладеності проглядання тексту, ціле від 1 до 15
CHAR_ REPLACEMENT Фігура, замінююча символ. Об'єкт GraiphicAttribute
FAMILY Сімейство шрифта. Рядок типа String
FONT Шрифт. Об'єкт класу Font
JUSTIFICATION Допуск при вирівнюванні абзаца. Об'єкт класу Float (від 0,0 до 1,0). Є дві константи: JUSTIFICATION__FULL і JUSTIFICATION_NONE
POSTURE Нахил шрифта. Об'єкт класу Float. Є дві константи: POSTUREJDBLIQUE і POSTURE_REGULAR
RUN_DIRECTION Проглядання тексту: run_direction_ltr – зліва направо, run_DIRECTION_rtl – справа наліво
SIZE Розмір шрифту в пунктах. Об'єкт класу Float
STRIKETHROUGH Перекреслювання шрифта. Kонстантa strike­through_on (за замовчуванням перекреслювання немає)
SUPERSCRIPT Підрядкові або надрядкові індекси. Константи: SUPERSCRIPT_NO, SUPERSCRIPT_SUB, SUPERSCRT_SUPER
SWAP_COLORS Заміна місцями кольору текста і кольору фона. Константа Swap_colorsjdn, за замовчуванням заміни немає
TRANSFORM Перетворення шрифта. Об'єкт класу AffineTransform
UNDERLINE Підкреслення шрифта. Константи: underline_on, UNDERLINE_LOW_DASHED, UNDERLINE_LOW_DOTTED, UNDERLINE_LOW_GRAY, UNDERLINE LOW_ONE_PIXEL, UNDERLINE LOW TWO PIXEL
WEIGHT Товщина шрифта. Константи: WEIGHT_ULTRA_LIGHT, WEIGHT_EXTRA_LIGHT, WEIGHT_LIGHT і ін.
WIDTH Ширина шрифта. Константи: WIDTH_CONDENSED, WIDTH_SEMI_CONDENSED, WIDTH_REGULAR, WIDTH_SEMI_EXTENDED, WIDTH_EXTENDED

У класі Font є конструктор Font(Map attrib), яким можна відразу задати потрібні атрибути створюваному шрифту. Це вимагає попереднього запису атрибутів в спеціально створений для цієї мети об'єкт класу, що реалізовує інтерфейс Мар: класу HashMap, WeakHashMap або Hashtable. Можна створити шрифт і другим конструктором, яким ми вже користу­ва­лися, а потім додавати і змінювати атрибути методами deriveFont() класу Font.

Текст в Java 2D має власний контекст – об'єкт класу FontRender­Con­text, що зберігає всю інформацію, необхідну для виведення тексту. Одер­жати його можна методом getFontRendexContext() класу Graphics2D.Вся інформація про текст, у тому числі і про його контекст, збирається в об'єкті класу TextLayout. Цей клас в Java 2D замінює клас FontMetrics.У конструкторі класу TextLayout задається текст, шрифт і контекст.

  1. Повідомлення та події. Поля та методи класу Event

Класи подій

В основі механізму обробки подій знаходяться класи подій, які забез­пе­чують непротирічиві та зручні для використання засоби інкапсуляції подій.

В корені ієрархії класів подій Java знаходиться клас EventObject, який розташовано в пакеті java.util. Це – суперклас для всіх подій. Один з його конструкторів:

EventObject(Object src)

де src – об’єкт, який генерує цю подію.

Клас EventObject містить два методи: getSource() і toString(). Метод getSource() повертає джерело події, а метод toString() повертає рядок – еквівалент події.

Клас AWTEvent, визначений в пакеті java.awt, є підкласом класу EventObject. Це суперклас (прямо або опосередковано) всіх AWT-подій, що використовуються моделлю делегування подій. Для визначення типу події можна використовувати його метод getID(). Його сигнатура:

int getID()

Пакет java.awt.event визначає декілька типів подій, які генеруються різноманітними елементами інтерфейса користувача. В таблиці 11 перераховуються найбільш важливі з цих класів подій та описується, коли вони генеруються. Відзначимо, що всі перераховані класи є нащадками класу AWTEvent.

Таблиця 11 – Основні класи подій java.awt.event

ActionEvent генерується, коли натиснуто кнопку, відбувся подвійний клік на елементові списку або обрано пункт меню
AdjustmentEvent генерується при маніпуляціях із смугою прокручування
ComponentEvent генерується, коли компонент сховано, пересунуто, змі­не­но в розмірі або зроблено видимим
ContainerEvent генерується, коли компонент додається або вилучається з контейнера
FocusEvent генерується, коли компонент отримує або втрачає фокус
InputEvent абстрактний суперклас для всіх класів подій введення компонентів
ItemEvent генерується, коли помічено прапорець або елемент спис­ку, зроблено вибір елемента в списку вибору, обрано (відмінено) елемент меню з міткою
KeyEvent генерується, коли отримано введення з клавіатури
MouseEvent генерується, коли об’єкт перетягується (dragged) або пе­ре­сувається (moved), відбувся щиглик (clicked), натиснуто (pressed) або відпущено (released) кнопку миші; також ге­нерується коли покажчик миші входить або виходить в (поза) межі компонента
TextEvent генерується, коли змінено значення текстової області або текстового поля
WindowEvent генерується, коли вікно активізовано, закрито, диз­акти­во­вано, розгорнуто або згорнуто, відкрито або відбувся ви­хід (exit) з нього
  1. Обробка повідомлень миші. Основні методи.
mouseDown() mouseUp() mouseDrag() mouseMove() mouseEnter() mouseExit() обробка повідомлень миші
  1. Обробка повідомлень клавіатури. Основні методи .
keyDown() keyUp() обробка повідомлень клавіатури
  1. Виведення растрових зображень. Класи Url та Image.
← Предыдущая страница | Следующая страница →