[Java] Swing GUI: калькулятор
Полезные горячие кнопки в IDEA:
- Чтобы быстро создать
main
-функцию: напечатать внутри класса вне каких-либо методовpsvm
и нажать Enter - Чтобы импортировать класс (когда он красный): поставить каретку для печатанья на класс и нажать
Alt+Enter
->Import - Чтобы отформатировать код:
Alt+Ctrl+L
- Чтобы запустить редактируемый в данный момент файл:
Ctrl+Shift+F10
- Чтобы IDE подсказала какие методы и поля есть у данного объекта: напечатать
myObject.
(можно еще явно нажатьCtrl+Space
) - Чтобы посмотреть какие аргументы принимает метод: напечатать
g.drawLine(
и нажатьCtrl+P
Правила сдачи
- До конца сегодняшнего занятия вы должны показать до чего вы успели дойти и получить оценку за урок
- В начале урока 17 декабря вы должны запустить на компьютере то что вы доделали дома и получить оценку за домашнее задание
Пример
1) Создайте окошко:
2) Добавьте на окошко кнопку:
3) Чтобы добавить кнопке какое-то действие в случае клика - нужно воспользоваться методом button.addActionListener
:
В дословном переводе этот метод означает “добавить слушатель события”. Чтобы посмотреть какие у метода аргументы - можно нажать Ctrl+P
:
У единственного требуемого аргумента тип ActionListener
- это интерфейс, поэтому надо создать новый класс MyButtonActionListener
и реализовать в нем данный интерфейс (ключевое слово implements
):
В ошибке сказано что раз вы заявили что ваш клас реализует интерфейс “слушатель события” (implements ActionListener
), то вы должны реализовать его абстрактный метод actionPerformed(ActionEvent)
.
Чтобы это просто сделать, достаточно поставить каретку ввода на строчку с этой ошибкой и нажать Alt+Enter
-> Implements methods
:
Теперь ваш класс реализовал ActionListener
(т.е. можно сказать что MyButtonActionListener
является ActionListener
) и его экземпляр (т.е. объект созданный как всегда через new
) можно передать в addActionListener
.
Задание 1
Убедитесь что при нажатии на кнопку в консоли появляется сообщение которое вы печатаете при обработке событий кнопки.
4) Укажите Layout
В окне кнопки и другие компоненты нужно как-то взаимно расположить. Для этого у окна можно указать “расположение внутренних компонент”, т.е. Layout
. Для этого есть метод setLayout
, смотрим какого типа аргумент он принимает через Ctrl+P
:
Некий LayoutManager
, это тоже интерфейс как и ActionListener
, но его не обязательно реализовывать в своем новом классе, т.к. есть уже несколько готовых.
Например есть менеджер который располагает компоненты на регулярной решетке, т.е. по сути ввиде таблицы из скольки-то строк и скольки-то столбцов. Этот менеджер представлен классом GridLayout
.
Чтобы посмотреть, какие аргументы принимает его конструктор - опять можно воспользоваться Ctrl+P
:
Конструктор ожидает два аргумента - количество строк (rows
, т.е. рядов) и количество столбцов (cols
= columns
, т.е. колонок).
Задание 2
Создайте шесть кнопок с указанием номера кнопки в названии кнопки, при нажатии кнопку с номером N
в консоль должно печататься сообщение testN
, и расположенны кнопки должны быть так:
Задание 3
Воспользуйтесь классом JLabel
(который наравне с JButton
является компонентом который можно добавить в окно) и сделайте три кнопки с текстом рядом с ними печатающие разный текст:
Задание 4
Сделайте калькулятор наподобие этого:
- Калькулятор при нажатии на цифру должен дописывать эту цифру к полю вверху.
- При нажатии на арифметическую операцию калькулятор должен запомнить текущее число и очистить поле для ввода числа, а затем (при нажатии на кнопку равенства) посчитать и вывести результат.
- При нажатии на
C
калькулятор должен очистить поле для ввода чисел и сбросить текущую выполняемую арифметическую операцию (если она есть)
Подсказки:
- Чтобы окно приняло размер соответствующий количеству компонент внутри -
frame.pack();
- Поле для ввода -
JTextField
- У классов
JTextField
иJLabel
есть методыgetText()
иsetText(String)
- Чтобы приобразовать строку в число можно воспользоваться конструктором
Integer
- пример:int x = new Integer("239");
- Для группировки компонентов может быть удобно использовать
JPanel
(и указать у каждой панели свойLayout
)