SLC S22 Week6 Java Graphical Programming with Swing

in Ukraine on Steem27 days ago

java6

image.png

Як же змінився світ, світ програмування. Пригадую шкільний Бейсик, де можна було відразу писати 'PRINT 2+2' чи LINE (1,1)-(100,100) І чого мені не вистачало в Pascal/C++ щоб без всяких InitGraph() - але що є те є.

На мою думку графіка, тобто робота з графічним інтерфейсом на java виглядає природніше, органічніше ніж на С/С++. То ж почну розбиратися з графікою на шостому уроці SLC22 Java Graphical Programming with Swing

Вправа 1: Приклад JFrame

Напишіть клас SimpleFrame, який відображає вікно. Призначте назву та мінімальний розмір.
Змініть стандартну поведінку вікна після закриття, щоб програма завершилася.
Додайте мітку до вікна, що представляє короткий текст. Отримайте контейнер, що відповідає клієнтській області вікна, використовуючи getContentPaneметод, і додайте мітку до цього контейнера.
Відцентруйте текст етикетки за допомогою setHorizontalAlignmentметоду.
Алгоритм розміщення компонентів для a JFrameкерується класом BorderLayout. Уважно прочитавши опис методу add(Component, Object)класу Container, додайте під написом кнопку «ОК».

Отже що ж таке Swing - це бібліотека що є частиною Java і надає набір компонентів для створення графічного інтерфейсу. Це добре, що нічого додатково встановлювати не треба.
Слід лиш підключити import javax.swing.*;

проте не легко було здогадатися що слід ще десь такий рядок прописати, без нього не підключалася бібліотека((
image.png

Спочатку створимо об'єкт вікна в пам'яті комп'ютера
JFrame frame = new JFrame("JFrame is not ConsoleOutput))");

Далі командою frame.setMinimumSize(new java.awt.Dimension(640, 480));
я задав розміри вікна розміром VGA щоб уявити як багато змінилося з тих часів)))

Далі вирівняним по горизонталі я створив мітку та додав текст, що прощається з консоллю))
JLabel label = new JLabel("No Console Output Here");
label.setHorizontalAlignment(SwingConstants.CENTER);

але frame та label ще ніяк не поєднані між собою.

Далі слід би було витягти contentPane для того щоб вказувати де розміщувати label та button
java.awt.Container contentPane = frame.getContentPane();

але я зацікавився що воно за ContentPane, бо перше що хотілося написати
то напряму frame.add(label, java.awt.BorderLayout.CENTER);
як виявилося метод add від frame перевантажений і всередині викликає getContentPane так як компоненти розміщуються в цьому контейнері.
Отже можна писати як так,
frame.getContentPane().setLayout(new java.awt.BorderLayout());
так і так
`frame.setLayout(new java.awt.BorderLayout());
але перший варіант дозволив краще зрозуміти внутрішню будову.

Далі додаю кнопку, точніше сказати створюю та додаю.
Але форма створена але все ще не відображається - для цього слід дати команду frame.setVisible(true);

image.png

image.png

Вправа 2 Відкриття нових компонентів

Створіть нове JFrameпід назвою «Відкриття» та додайте такі компоненти:
Кнопка,Текстове поле,Текстова область
Додайте спливаючу підказку (за допомогою setToolTipText()) до кнопки. Зробіть кнопку нефункціональною та змініть колір тексту та фону.
Додайте текст до текстового поля та текстової області. Зробіть текстове поле недоступним для редагування.
Додайте рамку до текстового поля, надавши javax.swing.border.Borderоб’єкт, створений за допомогою методу з javax.swing.BorderFactoryкласу, наприклад createLineBorder(Color color, int thickness)методу.

Спочатку я створюю фрейм (вікно) з заголовком "Discover". При закритті цього вікна буде закриватися і основна програма frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Розмір я встановлюю на 320x240 пікселів. Для розміщення компонентів у вікні я використовую BorderLayout.

Далі я створюю кнопку з написом "Button". Для неї я додаю підказку, яка з'являтиметься, коли користувач наведе курсор на неї. Кнопку я роблю неактивною
Цю кнопку я розміщую у верхній частині вікна (BorderLayout.NORTH).

Потім я створюю текстове поле (JTextField), з текстом "Text in the text field".
Встановлюю недоступним для редагування
Текстове поле я розміщую у центральній частині вікна (BorderLayout.CENTER).

Нарешті, я створюю текстову область (JTextArea), у яку за замовчуванням вписано текст "Text in the text area".

Після того, як всі компоненти додані до вікна, я роблю його видимим за допомогою frame.setVisible(true).
Тепер вікно відобразиться

t2.gif

Вправа 3

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

Добре коли програма щось відображає, хоча б ті ж кнопки, але вони не активні(( скільки б на них не натискав((

Додати їм активності можна у два способи:
ActionListener інтерфейс

Вже в звичний спосіб роблю форму JFrame з назвою «Button Actions».
через setSize встановлюю розмір вікна 640x120 пікселів
Буду компонувати компоненти через BorderLayout на buttonPanel з компонуванням FlowLayout і розміщеними кнопками по центру.
Далі я роблю масиви для назв кнопок що задаються при їх створенні та задаю опісля їм різні кольори.
Для кожної кнопки далі також створюється ActionListener, який визначає, що відбувається після натискання кнопки:
якщо це перша кнопка індекс 0, то виводиться текст в... консоль, знову любима рідна консоль)) А якщо кнопки інші, не 0, то дія змінює назву заголовку вікна.
Чесно кажучи трохи тут загруз через final j=i;

tas3.gif


...але використовуйте AbstractActionклас замість ActionListener інтерфейсу.

Йдемо по масиву назв кнопок, при цьому створюємо action дію з назвою, потім перезавантажуємо метод actionPerformed() в якому описуємо дії які слід зробити з кнопкою. А далі створюємо кнопку з дією і задаємо їй колір. Додаємо кнопку до панелі.

task3-bis.gif


В першому підході через ActionListener, ми створюємо кнопку і додаємо до неї дію, а в AbstractAction ми спочатку створюємо дію, а вже потім кнопку передавши створену дію в конструктор.

Вправа 4: Слухачі подій

Створіть вікно з кнопкою «Додати». Кожне натискання цієї кнопки має додавати у вікно кнопку з номером. Після натискання будь-якої з доданих кнопок вона зникає.
Додайте кнопку «Скинути» (поряд із «Додати»), яка видаляє всі додані кнопки.

Грайлива задача де кнопки то з'являються то зникають - це мені нагадало пасьянс акордеон))

Створюю JFrame з вертикальною орієнтацією 480*640, задаю менеджер розташування BorderLayout для головної форми, щоб розділити дві групи кнопок - робимо дві панелі panel та bpanel. І задамо для панелі з кнопками FlowLayout() щоб вони слідували одна за одною.

Далі задамо дію-реакцію на натиснення кнопки ActionListener де буде створено кнопку з назвою використовуючи загальний лічильник кнопок, і тут же також прописуємо дію яка буде виконана при натисненні на цю кнопку, а саме: видалення кнопки та оновлення панелі і перемалювання панелі.

При додавання кнопки Reset задаємо їй дію - видалити всі кнопки і оновити та перемалювати панель.

task4.gif

Вправа 5: Факторіал

Напишіть програму для обчислення факторіалу цілого числа, введеного в текстове поле. Якщо ціле число дорівнює 17 або більше, запропонуйте користувачу повторно ввести значення за допомогою відповідного діалогового повідомлення. Відображати результат у мітці після натискання кнопки, мітка якої оновлюється на "5!" якщо введено 5.

Створюю форму JFrame розміром 320*240, де розміщу мітку-напис "Введіть число ", далі буде поле вводу та кнопка.
Посередині форми буде виведено результат.

до кнопки додаємо ActionListener де через try пробуємо ввести число, а так як число може бути некоректно введене, або невірним то ці помилки слід перехопити обробкою ситуацій

Якщо число вірне то простим перемноженням обчислимо факторіал та виведемо його посеред форми.

task5.gif

Вправа 6

Вправа 6: Який твій вік?
I. Макет GUI
Розробіть наступний макет, враховуючи необхідні панелі та менеджери макета. Три білі текстові поля можна редагувати, а синє – ні. Ваші вихідні файли мають бути в пакеті з назвою ageIHM.

II. Обробники подій
Додайте обробники подій для кнопок. Ваші вихідні файли мають бути в пакеті з назвою calculage.

Я давно помітив що в Java з'явилися пакети, ще не до кінця зрозумів що воно)) але якщо в завданні треба - то треба, це щось схоже на різні модулі(файли) в С/С++

Отже в перший пакет(модуль)ageIHM я виніс лиш конструювання форми, в той час як код дій що виконуються при натисканні кнопок у файл-пакет-модуль calculage

Користувачу програми треба ввести своє ім'я в два поля та рік народження, в третє після чого програма обчислює поточний рік та вік користувача, а при натисненні кнопки реверсу перевертає ім'я користувача.(щоправда я не зрозумів що саме слід було перевертати)

такий поділ на пакети/модулі дозволяє наприклад вести різним розробникам паралельно код, коли один робить інтерфейс а інший функціонал коду, це пришвидшує розробку.

task5.gif

Вправа 7 Компонент JTable

Напишіть Student клас із рядковими атрибутами nameта firstNameяк.
Напишіть StudentLanguage клас з атрибутами: Student об’єкт і рядок, які представляють улюблену мову програмування студента (наприклад, C, C++, Java тощо).
Напишіть LanguageService клас, що реалізує шаблон проектування Singleton. Цей клас має надати метод, який повертає список улюблених мов студентів ( List). Студенти та їхні улюблені мови програмування повинні бути жорстко закодовані в програмі.
Напишіть LanguageModelклас, підклас AbstractTableModel. Ця «модель таблиці» пов’язана з таблицею даних, яка має відображатися. Заголовки таблиці — ім’я, ім’я та улюблена мова студента.

Клас Студента

image.png

Клас мов програмування

image.png

image.png

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

Далі я створюю клас StudentLanguage, який пов'язує студента з його улюбленою мовою програмування.
Цей клас містить об'єкт Student та рядок, який представляє мову програмування.

Далі я створюю клас LanguageService. Усередині цього класу я кодую дані про студентів та їхні мови.

Далі слід створити таблицю, створюю клас LanguageModel, який наслідує AbstractTableModel.
Цей клас відповідає за структуру таблиці, містить кількість стовпців, рядків, назви стовпців та дані, які будуть відображатися.
Дані сортую за улюбленою мовою в алфавітному порядку, щоб таблиця виглядала акуратно.

Якщо мова — "Java", текст буде червоним, а для інших мов — синім. Це допомагає виділити улюблену мову Java серед інших.

В головному класі, який відповідає за відображення вікна з таблицею я створюю фрейм (вікно) з заголовком "Student Language Table".
Я додаю таблицю до прокручуваного контейнера JScrollPane, щоб можна було прокручувати дані, якщо їх багато.

77.gif

PS Багато завдань, які скоріше легкі ніж сладні, але і на них пішло багато часу)))

Posted using SteemPro

Sort:  
Loading...

Congratulations, your post has been upvoted by @scilwa, which is a curating account for @R2cornell's Discord Community. We can also be found on our hive community & peakd as well as on my Discord Server

Manually curated by @ abiga554
r2cornell_curation_banner.png

Felicitaciones, su publication ha sido votado por @scilwa. También puedo ser encontrado en nuestra comunidad de colmena y Peakd así como en mi servidor de discordia

Loading...

Coin Marketplace

STEEM 0.17
TRX 0.24
JST 0.034
BTC 95505.15
ETH 2783.12
SBD 0.67