You are on page 1of 80

ЛЕКЦІЯ 9.

ВВЕДЕННЯ В SWING
Глибовець А.М.
ВВЕДЕННЯ В UI
 Перед початком вивчення Swing ви, як справжній
новачок, повинні задати питання, що таке UI?
 Відповідь для новачків - це "користувальницький
інтерфейс".
 Але оскільки мета цієї лекції полягає в тому, щоб ви
більше не були новачком, нам потрібно більш широке
визначення, ніж це.
ВВЕДЕННЯ В UI
 Отже, я знову ставлю запитання: що таке UI?
 Ви могли б визначити його як кнопки, на які натискаєте, поле
адреси, в яке вводите інформацію, і вікна, які відкриваєте і
закриваєте.
 Все це - елементи UI, але це не тільки речі, які ви бачите на
екрані.
 Мишка, клавіатура, гучність музики, кольору екрана,
використовувані шрифти та розташування об'єкта по
відношенню до іншого об'єкта - все це теж становить UI.
 Взагалі кажучи, будь-який об'єкт, який бере участь у взаємодії
користувача і комп'ютера, є частиною UI.
 Це здається таким простим, що ви, мабуть, здивуєтеся тому, як
багато людей і корпорацій займаються цим роками.
 Дійсно, зараз є дисципліни в університетах, що повністю
присвячені цій взаємодії.
РОЛЬ SWING
 Технологія Swing - це UI Java-платформа.
 Вона виступає як програмне забезпечення, що керує
взаємодією користувача і комп'ютера.
 По суті, вона служить посередником між
користувачем і комп'ютером.
 Як Swing робить це?

 Він надає механізми для управління аспектами UI

 У будь-якому випадку Swing надає вам всі


інструменти, необхідні для створення вашого
власного UI.
MVC
 Swing йде навіть на крок далі і реалізує відомий
шаблон проектування з основними принципами UI.
 Цей шаблон проектування називається Модель-
Представлення-Контролер (Model-View-Controller -
MVC) і прагне "розділити ролі".
 MVC зберігає код, відповідальний за зовнішній
вигляд чого-небудь, окремо від коду, що обробляє
дані, і окремо від коду, що реагує на взаємодію і
виконує зміни.
JCOMPONENT
 Базовим будівельним блоком всієї бібліотеки
візуальних компонентів Swing є JComponent.
 Це суперклас кожного компонента.

 Він є абстрактним класом, тому насправді ви не


можете створити JComponent, але він містить
буквально сотні функцій, які кожен компонент Swing
може використовувати як результат ієрархії класів.
JCOMPONENT
 Очевидно, що деякі концепції більш важливі, ніж інші,
але для наших цілей важливими є:
 JComponent - базовий клас не тільки для Swing-компонентів,
але також і для користувацьких компонентів
 Він забезпечує інфраструктуру фарбування для всіх
компонентів
 Він знає, як обробляти всі натискання клавіш на клавіатурі.
 Він містить метод add (), який дозволяє вам додати інші
JComponent. Цим способом ви можете додати будь який
Swing-компонент до будь-якого іншого Swing-компоненту для
створення вкладених компонентів (наприклад, JPanel, що
містить JButton, або навіть більш вигадливі комбінації,
наприклад JMenu, що містить JButton).
ПРОСТІ SWING-ВІДЖЕТИ
JLABEL
 Самим основним компонентом в бібліотеці Swing є
JLabel.
 Він робить саме те, чого ви від нього очікуєте:
 розташовується в потрібному місці, покращує вид
програми і описує інші компоненти.
 Не дуже вражаюче, але все одно корисно.
 Фактично, ви використовуєте компоненти JLabel по
всій програмі не тільки як текстові описи, але і як
графічні описи.
 Коли б ви не побачили зображення в Swing-додатку, є
шанс, що це JLabel.
 У JLabel має не багато методів для новачків в Swing,
крім, можливо, очікуваних вами.
ПРОСТІ SWING-ВІДЖЕТИ
JLABEL
 До основних методів відноситься установка тексту,
зображення, вирівнювання:
 get / setText (): Отримати / встановити текст в мітці.
 get / setIcon (): Отримати / встановити зображення мітці.
 get / setHorizontalAlignment (): Отримати / встановити
горизонтальну позицію тексту.
 get / setVerticalAlignment (): Отримати / встановити
вертикальну позицію тексту.
 get / setDisplayedMnemonic (): Отримати / встановити
мнемоніку (підкреслений символ) для позначки.
 get / setLabelFor (): Отримати / встановити компонент, до
якого приєднана дана мітка;
 Коли користувач натискає комбінацію клавіш Alt +
мнемоніка, фокус переміщується на вказаний компонент.
ПРОСТІ SWING-ВІДЖЕТИ
JBUTTON
 Основним активним компонентом в Swing є JButton,
кнопка, яку ви бачите (з написами OK і Cancel) у
кожному вікні, він робить саме те, що очікується від
кнопки - ви натискаєте на неї, і щось відбувається.
 Що саме відбувається?

 Ви повинні визначити це.

 Методи, що використовуються для зміни


властивостей JButton, аналогічні методам JLabel (ви
виявите, що вони аналогічні для більшості Swing-
компонентів).
ПРОСТІ SWING-ВІДЖЕТИ
JBUTTON
 Вони управляють текстом, зображеннями та
орієнтацією:
 get / setText (): Отримати / встановити текст в кнопці.
 get / setIcon (): Отримати / встановити зображення кнопці.
 get / setHorizontalAlignment (): Отримати / встановити
горизонтальну позицію тексту.
 get / setVerticalAlignment (): Отримати / встановити
вертикальну позицію тексту.
 get / setDisplayedMnenomic (): Отримати / встановити
мнемоніку (підкреслений символ), яка в комбінації з
кнопкою Alt викликає натискання кнопки.
ПРОСТІ SWING-ВІДЖЕТИ
JBUTTON
 Крім цих методів я познайомлю вас із ще однією
групою методів, які містить JButton.
 Ці методи використовують всі різні стани кнопки.
 Стан - це властивість, що описує компонент, звичайно
має значення true / false.
 У випадку з JButton він має наступні можливі стани:
активна / неактивна, обрана / не вибрана, мишка зверху
/ мишки немає, натиснута / віджата.
 Крім того, ви можете комбінувати стани, наприклад:
кнопка може бути обрана й над нею знаходиться
мишка.
 Зараз ви, можливо, питаєте себе, для чого мені всі ці
стани.
ПРОСТІ SWING-ВІДЖЕТИ
JBUTTON
 Методами стану для JButton є:
 get / setDisabledIcon ()
 get / setDisabledSelectedIcon ()
 get / setIcon ()
 get / setPressedIcon ()
 get / setRolloverIcon ()
 get / setRolloverSelectedIcon ()
 get / setSelectedIcon ()
ПРОСТІ SWING-ВІДЖЕТИ
JTEXTFIELD
 Основним текстовим компонентом в Swing є
JTextField; він дозволяє користувачам вводити текст в
UI.
 Ви повинні цікавитися тільки одним методом при
роботі з JTextField, і це повинен бути, очевидно,
метод, який встановлює текст: get / setText ().
 Цей метод отримує / встановлює текст всередині
JTextField.
ПРОСТІ SWING-ВІДЖЕТИ
JFRAME
 Поки ми розглянули три основних будівельних блоки
Swing: мітку, кнопку і текстове поле; тепер ви
повинні кудись помістити їх.
 Вони не можуть просто літати по екрану в надії на
те, що користувач знає, як працювати з ними.
 Клас JFrame робить саме це - він є контейнером, що
дозволяє додавати до себе інші компоненти для їх
організації та представлення користувачу.
ПРОСТІ SWING-ВІДЖЕТИ
JFRAME
 JFrame насправді робить більше, ніж просто дозволяє
вам розміщувати компоненти на ньому і надавати їх
користувачеві.
 Незважаючи на всю його уявну простоту, він
фактично є одним з найскладніших компонентів в
Swing-пакетах.
 Говорячи дуже спрощено, JFrame виступає як міст
між незалежними від OS Swing-частинами та
реальною OS, на якій вони працюють.
 JFrame реєструється як вікно в OS і таким чином
отримує багато з знайомих властивостей вікна
операційної системи: мінімізація / максимізація,
зміна розмірів і переміщення.
ПРОСТІ SWING-ВІДЖЕТИ
JFRAME
 Деякими з методів, які ви можете викликати з JFrame
для зміни його властивостей, є:
 get / setTitle (): Отримати / встановити заголовок.
 get / setState (): Отримати / встановити стан (мінімізувати,
максимізувати і т.д.).
 is / setVisible (): Отримати / встановити видимість,
іншими словами, відображення на екрані.
 get / setLocation (): Отримати / встановити місце
розташування у вікні, де фрейм має з'явитися.
 get / setSize (): Отримати / встановити розмір.
 add (): Додати компоненти до фрейму.

 Подивимося на простий приклад FirstUI.java.


ДОДАТКОВІ SWING-ВІДЖЕТИ
JCOMBOBOX
 Розглянемо інші компоненти в бібліотеці Swing: як їх
використовувати, і на що вони схожі.
 Ми почнемо з JComboBox.

 Комбінований список є знайомим випадаючим


списком елементів, в якому користувачі можуть
обрати нуль або один (і тільки один) елемент зі
списку.
 У деяких версіях комбінованого списку ви можете
ввести ваш власний варіант.
 Хорошим прикладом є адресний рядок вашого
браузера; це комбінований список, що дозволяє
ввести власний варіант.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCOMBOBOX
 Важливими функціями JComboBox є функції, які
працюють з даними, що містяться в ньому.
 Ви повинні мати спосіб встановити дані в
JComboBox, змінити їх і отримати вибір користувача
після того, як він його зробив.
 Ви можете використовувати такі методи JComboBox:
 addItem (): Додати елемент до JComboBox.
 get / setSelectedIndex (): Отримати / встановити індекс
обраного елемента в JComboBox.
 get / setSelectedItem (): Отримати / встановити вибраний
об'єкт.
 removeAllItems (): Видалити всі об'єкти з JComboBox.
 remoteItem (): Видалити конкретний об'єкт з JComboBox.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JPASSWORDFIELD
 Різновидом JTextField є JPasswordField, який
дозволяє приховувати всі символи, що
відображаються на екрані в текстовому полі.
 Зрештою, що це за пароль, який можуть бачити всі
охочі в той час, коли ви його вводите?
 Можливо, це взагалі не пароль, і в даний час, коли
ваші персональні дані дуже важливі, ви повинні
використовувати всі можливості щодо їх захисту, які
можете отримати.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JPASSWORDFIELD
 Додаткові "захищені" методи JPasswordField незначно
змінюють свою поведінку в порівнянні з JTextField, для
того щоб ви не змогли прочитати текст:
 get / setEchoChar (): Отримати / встановити символ, який
з'являється в JPasswordField при введенні тексту. При отриманні
пароля символ "echo" не повертається; замість нього
повертається реальний символ.
 getText (): Ви не повинні використовувати цю функцію,
оскільки вона має деякі проблеми з захистом ( String
зберігається в оперативній пам'яті, і можливий дамп купи може
відкрити пароль).
 getPassword (): Це коректний метод для отримання пароля з
JPasswordField, оскільки повертає масив char [], що містить
пароль. Для гарантування нормальної захищеності масив
повинен бути очищений в 0, для того щоб він не залишався в
оперативній пам'яті.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCHECKBOX / JRADIOBUTTON
 Компоненти JCheckBox і JRadioButton надають
користувачеві варіанти для вибору, звичайно в
багатоваріантному форматі.
 У чому відмінності?

 З практичної точки зору вони однакові.

 Їх поведінка однакова.

 Однак у звичайній UI-практиці вони мають невелике


розходження.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCHECKBOX / JRADIOBUTTON
 JRadioButton зазвичай групуються разом для надання
користувачу питання з примусовою відповіддю
(відповіді взаємовиключні - може бути тільки одна
відповідь на питання).
 Поведінка JRadioButton змушує робити саме так.

 Як тільки ви вибрали JRadioButton, ви не можете


зняти його позначку до тих пір, поки не виберете
інший варіант з групи.
 JCheckBox працює інакше.

 Він дозволяє відзначати / знімати позначку з варіанту


в будь-який час і вибирати кілька відповідей на
питання.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCHECKBOX / JRADIOBUTTON
 Ось приклад.
 На питання "Ви юнак чи дівчина?" є два унікальних
варіанти відповіді: "Юнак" або "Дівчина".
 Користувач повинен вибрати один і не може вибрати
обидва.
 З іншого боку, на питання "Яке ваше хобі?" можна
дати кілька відповідей.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCHECKBOX / JRADIOBUTTON
 Класом, який дозволяє групувати разом компоненти
JCheckBox або JRadioButton, є клас ButtonGroup.
 Він дозволяє групувати варіанти (наприклад, "Юнак"
і "Дівчина") таким чином, що при виборі одного, з
іншого позначка автоматично знімається.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JCHECKBOX / JRADIOBUTTON
 Важливими методами ButtonGroup, які варто
запам'ятати, є:
 add (): Додати JCheckBox або JRadioButton до
ButtonGroup.
 getElements (): Отримати всі компоненти в ButtonGroup,
для того щоб можна було виконати ітерацію по ним для
пошуку вибраного.
 Дивимося приклад SecondUI
ДОДАТКОВІ SWING-ВІДЖЕТИ
JMENU / JMENUITEM / JMENUBAR
 Компоненти JMenu, JMenuItem і JMenuBar є
головними будівельними блоками для розробки
системи меню у вашому JFrame.
 Основою будь-якої системи меню є JMenuBar.

 Він простий і нудний, але він необхідний, оскільки


кожен JMenu і JMenuItem створюється з ним.
 Для приєднання JMenuBar до JFrame
використовується метод setJMenuBar().
 Після його закріплення в JFrame ви можете додавати
всі меню, підменю та елементи меню, які хочете.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JMENU / JMENUITEM / JMENUBAR
 Різниця JMenu / JMenuItem, можливо, очевидна, але
фактично вона прихована всередині і якраз не є
очевидною.
 Якщо ви подивитеся на ієрархію класів, JMenu є
підкласом JMenuItem.
 Проте за зовнішнім виглядом вони мають
відмінність:
 JMenu використовується для утримання інших JMenuItem
і JMenu;
 JMenuItem при виборі активізує дію.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JMENU / JMENUITEM / JMENUBAR
 JMenuItem також підтримує скорочені клавіатурні
команди.
 Як і більшість програм, які ви використовуєте, Swing-
додатки дозволяють натиснути Ctrl + (клавіша) для
активізації дії, аналогічно натисненню відповідного
елемента меню.
 Згадайте Ctrl + X і Ctrl + V, які ви використовуєте для
копіювання та вставки.
 Крім того, JMenu і JMenuItem підтримують мнемоніки.
 Ви можете використовувати клавішу Alt разом з
буквою, призначеної меню як мнемоніки (наприклад,
натискання Alt + F, а потім Alt + x закриває додаток в
Windows).
ДОДАТКОВІ SWING-ВІДЖЕТИ
JMENU / JMENUITEM / JMENUBAR
 Важливими методами, які вам потрібні в цих класах,
є:
 JMenuItem і JMenu:
 get / setAccelerator (): Отримати / встановити комбінацію Ctrl +
клавіша, яка у ролі клавіатурного скорочення.
 get / setText (): Отримати / встановити текст для меню.

 get / setIcon (): Отримати / встановити зображення, що

використовується в меню.
 Тільки JMenu:
 add (): Додати ще один JMenu або JMenuItem до JMenu
(створення вкладеного меню).
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSLIDER
 Компонент JSlider використовується в програмі для
зміни числового значення.
 Це швидкий і простий спосіб дозволити
користувачам візуально отримати відповідну реакцію
не тільки на їх поточний вибір, але побачити діапазон
допустимих значень.
 Подумайте, ви могли б надати текстове поле і
дозволити користувачеві ввести значення, але тоді у
вас додається зайва робота - ви повинні гарантувати,
що введене значення є числом, яке потрапляє в
потрібний діапазон.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSLIDER
 Важливими методами в JSlider є:
 get / setMinimum (): Отримати / встановити мінімальне
значення, яке ви можете вибрати.
 get / setMaximum (): Отримати / встановити максимальне
значення, яке ви можете вибрати.
 get / setOrientation (): Отримати / встановити орієнтацію
JSlider (вгору / вниз або вправо / вліво).
 get / setValue (): Отримати / встановити початкове
значення JSlider.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSPINNER
 Багато в чому аналогічно JSlider ви можете
використовувати JSpinner, для того щоб дозволити
користувачам вибирати цілочисельне значення.
 Перевагою є його компактний розмір у порівнянні з
JSlider.
 Хоча недоліком є ​те, що ви не можете легко
встановити його межі.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSPINNER
 Однак порівняння цих двох компонентів тут
закінчується.
 JSpinner набагато більш гнучкий і може бути
використаний для вибору з будь-якої групи значень.
 Крім вибору чисел він може бути використаний для
вибору дат, імен, кольорів, чого-завгодно.
 Це робить JSpinner надзвичайно потужним,
дозволяючи вам надавати компонент, який містить
тільки існуючі варіанти.
 У цьому він аналогічний JComboBox
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSPINNER
 Важливими методами є:
 get/ setValue (): Отримати / встановити початкове
значення JSpinner, яке в базовому випадку має бути цілим
числом.
 getNextValue (): Отримати таке значення, яке буде
вибрано після натискання клавіші управління курсором
"стрілка вгору".
 getPreviousValue (): Отримати попереднє значення, яке
буде вибрано після натискання клавіші управління
курсором "стрілка вниз".
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTOOLBAR
 Компонент JToolBar виступає як палітра для інших
компонентів (JButtons, JComboBoxes і т.д.), які
спільно утворюють панелі інструментів, що
зустрічаються в більшості додатків.
 Важливим методом JToolBar є is / setFloatable (), який
отримує / встановлює властивість: чи може JToolBar
переміщатися.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTOOLTIP
 Ви, можливо, зустрічали JToolTip всюди, але ніколи
не знали, як вони називаються.
 Вони схожі на пластикові кінці ваших шнурків - вони
всюди, але ви не знаєте правильної назви (вони
називаються aglet (пістон), якщо кому цікаво).
 JToolTip - це невеликі "бульбашки", які спливають
тоді, коли ви наводите і тримайте курсор миші над
чим-небудь.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTOOLTIP
 Вони можуть бути дуже корисні в додатках, надаючи
підказки для елементів, деталізуючи інформацію або
навіть показуючи повний текст елемента в стислих
UI.
 Вони активізуються в Swing, якщо залишити курсор
миші над компонентом на певну кількість часу;
зазвичай вони з'являються приблизно через секунду
після зупинки мишки і залишаються видимими до
тих пір, поки курсор залишається над компонентом.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTOOLTIP
 Компоненти JToolTip легко використовувати.
 Метод setToolTip () є методом класу JComponent,
тобто, кожен Swing-компонент може мати підказку,
пов'язану з ним.
 Хоча JToolTip і сам є Swing-класом, він, фактично, не
надає в даний час додаткової функціональності і не
повинен створюватися.
 Ви можете звернутися до нього і використовувати,
викликаючи функцію setToolTip () в JComponent.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JOPTIONPANE
 Компонент JOptionPane - це свого роду
"прискорюючий" клас в Swing.
 Часто, як UI-розробник, ви хотіли б надати миттєве
повідомлення для ваших користувачів, кажучи їм про
помилку або видаючи якусь іншу інформацію.
 Можливо, ви хотіли б швидко отримати деякі дані,
наприклад, ім'я або номер.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JOPTIONPANE
 У Swing клас JOptionPane надає можливість виконати
ці рутинні завдання.
 Замість того, щоб кожного разу винаходити колесо,
Swing надає базовий, але корисний клас для надання
UI-розробникам способу видачі та отримання
простих повідомлень.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JOPTIONPANE
 Певного роду хитрістю при роботі з JOptionPane є всі
його можливі варіанти, які ви можете
використовувати.
 Одним з кращих способів вивчити JOptionPane - це
попрацювати з ним, закодувати і подивитися, що
вийшло.
 Перейдіть краще на сторінку API JOptionPane
документації для їх перегляду.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTEXTAREA
 Компонент JTextArea розвиває JTextField.
 У той час як JTextField обмежений одним рядком
тексту, JTextArea дозволяє мати кілька рядків.
 Думайте про нього, як про порожню сторінку, що
дозволяє ввести все що завгодно.
 Як ви вже напевно здогадалися, JTextArea має багато
функцій, присутніх в JTextField; в кінці кінців, це
практично однакові частини.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTEXTAREA
 Однак JTextArea пропонує кілька додаткових
функцій.
 До них відносяться здатність переносити слова
(тобто, переносити довге слово в наступний рядок
замість обрізання по середині слова) і здатність
переносити текст (тобто, поміщати довгі рядки
тексту на наступний рядок замість створення дуже
довгого рядка, що вимагає наявності горизонтальної
полоси прокрутки).
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTEXTAREA
 Важливими методами для вирішення переносу рядка
і перенесення слова є:
 is / setLineWrap (): Встановлює, чи повинен переноситися
рядок, якщо він стає занадто довгим.
 is / setWrapStyleWord (): Встановлює, чи переноситися
слово на наступний рядок, якщо воно занадто довге.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSCROLLPANE
 Розглядаючи наведений вище приклад, припустимо,
що JTextArea містить занадто багато тексту для
даного простору.
 Що тоді?

 Якщо ви думаєте, що смуги прокрутки з'являться


автоматично, то, на жаль, помиляєтеся.
 JScrollPane усуває цю прогалину, надаючи Swing-
компонент для обробки всіх дій по прокручуванню.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSCROLLPANE
 Ви не повинні працювати з JScrollPane
безпосередньо, створюючи поза компонентом, який
буде її використовувати.
 Що стосується наведеного вище прикладу,
викликаючи конструктор JScrollPane з JTextArea, ви
створюєте можливість для JTextArea прокручуватися
тоді, коли текст стає занадто довгим:
 JScrollPane scroll = new JScrollPane (getTextArea ());
 add (scroll);
ДОДАТКОВІ SWING-ВІДЖЕТИ
JSCROLLPANE
 Методами, які ви повинні використовувати з
JScrollPane, є:
 getHorizontalScrollBar (): Повертає горизонтальний
компонент JScrollBar.
 getVerticalScrollBar (): Повертає вертикальний компонент
JScrollBar.
 get / setHorizontalScrollBarPolicy (): Ця "політика" може
приймати одне з наступних значень: Always (завжди),
Never (ніколи), або As Needed (за потребою).
 get / setVerticalScrollBarPolicy (): Аналогічно
горизонтальної функції.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JLIST
 Компонент JList є корисним компонентом для
надання користувачу багатьох варіантів для вибору.
 Ви можете представляти його як розширення
JComboBox.
 JList надає більше варіантів і додає можливість
вибору декількох варіантів.
 Вибір між JList і JComboBox часто полягає в
наступному: якщо вам потрібна можливість
множинного вибору або є більше 15 варіантів (хоча
це число не є загальним правилом), ви повинні
завжди вибирати JList.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JLIST
 Ви повинні використовувати JList спільно з
JScrollPane, як було показано вище, оскільки він
може надавати більше варіантів, ніж поміщається у
видимій області.
 JList має також модель вибору (також наявну в
JTable), яку ви можете встановити в різні типи
вибору варіантів.
 Такими типами є: одиночний вибір (ви можете
вибрати тільки один варіант), одиночний інтервал (ви
можете вибрати суміжні варіанти, але в будь-якій їх
кількості) і множинний інтервал (ви можете вибрати
будь-яке число варіантів в будь-яких комбінаціях).
ДОДАТКОВІ SWING-ВІДЖЕТИ
JLIST
 JList є першим з компонентів, які я називаю
"складними компонентами", і до яких належать
також компоненти JTable і JTree, що допускають
велику кількість налаштувань, в тому числі
зовнішнього вигляду і способу обробки даних.
 Існує багато функцій в JList для роботи з даними, і,
як я вже сказав, це тільки деякі з тих, які будуть
потрібні для вашої роботи з JList.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JLIST
 Ось основні методи:
 get / setSelectedIndex (): Отримати / встановити обрану
рядок списку; у випадку зі списками з множинним
вибором повертається int [].
 get / setSelectionMode (): Як пояснювалося раніше,
отримати / встановити режим вибору в одиночний вибір,
одиночний інтервал або множинний інтервал.
 setListData (): Встановити дані для використання в JList.
 get / setSelectedValue (): Отримати вибраний об'єкт (як
протилежність обраному номеру рядка).
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTABLE
 Уявіть собі електронну таблицю Excel при розгляді
компонента JTable, і ви отримаєте ясну картину того, що
робить в Swing компонент JTable.
 Він має багато таких же характеристик: комірки, рядки,
стовпці, переміщення стовпців або приховання стовпців.
JTable розвиває ідею JList.
 Замість відображення даних в одному стовпці він відображає
їх у декількох.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTREE
 JTree - це ще один складний компонент, який не так
важко використовувати, як JTable, але не так просто,
як JList.
 Хитрість при роботі з JTree полягає в необхідних
моделях даних.
 JTree успадковує свою функціональність з концепції
дерева з гілками і листями.
ДОДАТКОВІ SWING-ВІДЖЕТИ
JTREE
 Швидше за все, ви виявите, що дерево не настільки
корисно в додатку, як таблиця або список, тому в
Інтернеті немає великої кількості корисних
прикладів.
 Фактично, аналогічно JTable, компонент JTree не має
яких-небудь функцій для новачків.
 Якщо ви вирішите використовувати JTree, то тут же
перейдете на середній рівень і повинні будете
вивчити концепції, що лежать в основі його роботи.
КОНЦЕПЦІЇ SWING
СХЕМИ, МОДЕЛІ ТА ПОДІЇ
 Тепер, коли ви знайомі з більшістю (але безумовно не
з усіма) компонентів, які можна використовувати для
створення UI, необхідно щось з ними робити
реальне.
 Ви не можете просто випадково розмістити їх на
екрані і чекати від них негайної роботи.
 Ви повинні розмістити їх у певні місця, реагувати на
взаємодію з ними, оновлювати їх на основі цієї
взаємодії і заповнювати даними.
 Необхідне подальше вивчення інших важливих
частин UI для заповнення прогалин у ваших знаннях.
КОНЦЕПЦІЇ SWING
СХЕМИ, МОДЕЛІ ТА ПОДІЇ
 Схеми (layout): Swing містить безліч схем, які
представляють собою класи, керуючі розміщенням
компонентів в додатку і тим, що має статися з ними
при зміні розмірів вікна програми або при видаленні
або додаванні компонентів.
КОНЦЕПЦІЇ SWING
СХЕМИ, МОДЕЛІ ТА ПОДІЇ
 Події (event): Ви повинні реагувати на натискання
клавіші, натиснення кнопки миші і на все інше, що
користувач може зробити в UI.
 Подумайте про те, що було б, якби ви цього не
робили - користувачі натискають на кнопки, а нічого
не відбувається.
КОНЦЕПЦІЇ SWING
СХЕМИ, МОДЕЛІ ТА ПОДІЇ
 Моделі (model): Для більш просунутих компонентів
(списки, таблиці, дерева) і навіть для деяких більш
простих, наприклад, JComboBox, моделі - це
найефективніший спосіб роботи з даними.
 Вони видаляють велику частину роботи по обробці
даних з самого компонента (згадайте обговорення
MVC) і надають оболонку для загальних об'єктних
класів даних (наприклад, Vector і ArrayList).
ПРОСТІ СХЕМИ
 Як уже говорилося в попередньому розділі, схема
управляє розташуванням компонентів у додатку.
 Вашим першим питанням могло б бути питання
"чому я просто не можу вказати місце розташування,
використовуючи пікселі"?
 Так, ви можете, але тоді відразу ж виникне проблема
при зміні розмірів вікна.
 Менеджери схем беруть все це на себе.
ПРОСТІ СХЕМИ
 Ніхто не використовує одні й ті ж налаштування,
тому менеджери схем створюють "відносні" схеми,
дозволяючи вам вказувати, як має відбуватися зміна
розмірів щодо інших розміщених компонентів.
ПРОСТІ СХЕМИ
 Хороша новина: це легше зробити, ніж сказати.
 Ви просто викликаєте setLayout (yourLayout) для
настройки менеджера схеми.
 Наступні виклики add () додають компонент в
контейнер і дозволяють менеджеру схеми подбати
про їх розміщення.
ПРОСТІ СХЕМИ
 У Swing включено багато схем; таке враження, що з
кожною версією з'являється нова, яка служить ще
одній меті.
 Однак деякі перевірені часом схеми існували завжди,
а під словом завжди я розумію час з появи першої
версії мови Java в 1995 році.
 Такими схемами є FlowLayout, GridLayout і
BorderLayout.
ПРОСТІ СХЕМИ
 У схемі FlowLayout компоненти розташовуються
зліва направо.
 Коли простір закінчується, відбувається перехід на
новий рядок.
 Це сама проста у використанні схема і найменш
потужна:
 setLayout (new FlowLayout ());
 add (new JButton ("Button1"));
 add (new JButton ("Button2"));
 add (new JButton ("Button3"));
ПРОСТІ СХЕМИ
 Схема GridLayout робить точно те, що ви подумали:
вона дозволяє вказати кількість рядків і стовпців, а
потім розміщує компоненти в цих осередках по мірі
їх додавання:
 setLayout (new GridLayout (1,2));
 add (new JButton ("Button1"));
 add (new JButton ("Button2"));
 add (new JButton ("Button3"));
ПРОСТІ СХЕМИ
 Схема BorderLayout все ще є дуже корисною,
незважаючи на додавання в Swing нових схем.
 Навіть досвідчені UI-розробники часто
використовують BorderLayout.
 У ній використовуються поняття North (північ), South
(південь), East (схід), West (захід) і Center (центр) для
розміщення компонентів на екрані:
 setLayout (new BorderLayout ());
 add (new JButton ("Button1"), "North");
 add (new JButton ("Button2"), "Center");
 add (new JButton ("Button3"), "West");
GRIDBAGLAYOUT
 У той час як наведені вище приклади гарні для
простих схем, більш просунуті UI вимагають
використання більш складного менеджера схеми.
 Ось тут потрібен GridBagLayout.

 На жаль, цей менеджер схем дуже заплутаний і


важкий, і кожен, хто працював з ним, погодиться з
цим.
 Я теж не можу не погодитися, але, незважаючи на
його складність, він, ймовірно, є найкращим (з усіх
менеджерів схем, вбудованих в Swing) способом
створення UI.
ПОДІЇ
 Нарешті, ми перейшли до найбільш важливих елементів
Swing - роботі з подіями і реакції на взаємодію з UI.
 Swing оброблює події, використовуючи модель подія /
прослуховувач.
 Ця модель працює шляхом дозволу деяким класам
реєструватися на події від компонента.
 Такий клас називається Прослуховувач (listener), оскільки він
чекає виникнення подій в компоненті і виконує дії при їх
виникненні.
 Компонент сам знає, як "активувати" подію (тобто, він знає
типи взаємодій, які може генерувати, і як дати
Прослуховувачу знати, коли відбуваються ці взаємодії).
 Він передає цю взаємодія за допомогою подій (event), класів,
що містять інформацію про взаємодію.
ПОДІЇ
 Прибравши технічну балаканину, розглянемо деякі
приклади роботи подій в Swing.
 Я почну з найпростішого прикладу - кнопки JButton і
виведення повідомлень "Hello" на консоль при її
натисканні.
 JButton знає, коли на неї натискають; це обробляється
всередині компонента, код для обробки цього не
потрібен.
 Однак Прослуховувач повинен зареєструватися для
отримання цієї події від JButton, для того щоб ви
могли вивести повідомлення "Hello".
ПОДІЇ
 Клас listener робить це, реалізуючи інтерфейс listener
і викликаючи метод addActionListener () компонента
JButton:
 // Створити JButton
 JButton b = new JButton("Button");
 // Зареєструвати прослуховувач
 b.addActionListener(new HelloListener());
 class HelloListener implements ActionListener{
 // Метод інтерфейса для отримання натисканнь кнопки
 public void actionPerformed(ActionEvent e){
 System.out.println("Hello");

 }

}
ПОДІЇ
 Компонент JList працює аналогічно.
 Коли хтось вибирає щось у JList, ви виводите на
консолі повідомлення про вибраний об'єкт:
 //myList - це JList, заповнений даними
 myList.addListSelectionListener(new ListSelectionListener()
{
 public void valueChanged(ListSelectionEvent e){
 Object o = myList.getSelectedItem();

 System.out.println(o.toString());

 }

 });
МОДЕЛІ
 Ви повинні знати про Java Collections, набори Java-класів,
що обробляють дані.
 До цих класів відносяться ArrayList, HashMap і Set.
 Більшість програм використовує ці класи всюди при
переміщенні даних взад і вперед.
 Однак при необхідності використання цих даних в UI
виникає одне обмеження.
 UI не знає, як їх відображати.
 Подумайте про це хвилинку.
 Якщо у вас є JList і ArrayList деяких об'єктів даних
(наприклад, об'єктів Person), як JList дізнається, що
відображати?
 Чи повинен він відображати тільки прізвище, або прізвище
та ім'я разом?
МОДЕЛІ
 Ось де потрібна концепція моделі.
 Хоча поняття моделі відноситься до більш широкої
області, я використовую поняття UI-модель для
опису класів, які компоненти використовують для
відображення даних.
 Кожен компонент, який працює з колекцією даних в
Swing, використовує концепцію моделі, і це кращий
спосіб використання та управління даними.
 Він чітко відокремлює роботу UI від
використовуваних даних (згадайте приклад MVC).
 Модель описує компоненту, як відображати колекцію
даних.
МОДЕЛІ
 Що я маю на увазі під словом "описує"?
 Кожен компонент вимагає трохи різного опису:
 JComboBox вимагає від своєї моделі опису тексту для
відображення у вигляді варіантів вибору і кількості існуючих
варіантів.
 JSpinner вимагає від своєї моделі опису тексту для відображення,
а також описи попереднього і наступного варіантів.
 JList теж вимагає від своєї моделі опису тексту для відображення
як варіантів вибору і кількості існуючих варіантів.
 JTable потрібно набагато більше - він вимагає від своєї моделі
опису кількості існуючих рядків і стовпців, назв стовпців, класу
кожного стовпця і тексту для відображення в кожному осередку.
 JTree вимагає від своєї моделі опису кореневого вузла, предків і
дочірніх елементів для всього дерева.
МОДЕЛІ
 Ви можете запитати, навіщо все це робити?
 Навіщо знадобилося розділяти всю цю
функціональність?
 Уявіть собі сценарій: у вас є закінчена таблиця з
багатьма стовпцями даних, і ви використовуєте цю
таблицю на різних екранах.
 Якщо ви несподівано вирішите видалити один зі
стовпців, що було б легше, змінити код в кожному
одиничному екземплярі JTable, використаному вами,
або змінити його в одному класі моделі, який ви
створили для використання з кожним примірником
JTable?
 Очевидно, що краще змінити клас.
ПРИКЛАДИ МОДЕЛІ
 Давайте розглянемо, як працює модель, на простому
прикладі JComboBox.
 У попередньому розділі про JComboBox я показав вам, як
додавати елементи до даних, викликаючи setItem ().
 Хоча це і прийнятно для простих демонстрацій, в реальних
додатках так роблять не часто.
 Зрештою, коли є 25 варіантів, і вони постійно змінюються,
невже ви захочете проходити по ним в циклі, викликаючи
addItem () 25 разів?
 Звичайно ж, ні.
 JComboBox має метод setModel(), який приймає екземпляр
класу ComboBoxModel.
 Ви повинні використовувати цей метод замість методу
addItem () для створення даних в JComboBox.
ПРИКЛАДИ МОДЕЛІ
 Розглянемо приклад ModelTest
ПРИКЛАДИ МОДЕЛІ
 Моделі є корисними можливостями Swing, оскільки
вони надають можливість повторного використання
коду і набагато більш легко працюють з даними.
 Як це часто трапляється у великомасштабних
додатках, розробники серверної частини створюють і
витягають дані та передають їх UI-розробникам.
 Обов'язком UI-розробника є працювати з даними і
відображати їх правильно, а моделі - інструменти, які
роблять це.
 Подивимося пакет notepad
ДЯКУЮ ЗА УВАГУ!

You might also like