[Java] Введение в GUI/Swing - задание
Полезные горячие кнопки в IDEA:
- Чтобы быстро создать
main
-функцию: напечатать внутри класса вне каких-либо методовpsvm
и нажать Enter - Чтобы импортировать класс (когда он красный): поставить каретку для печатанья на класс и нажать
Alt+Enter
->Import - Чтобы переопределить метод (или создать конструктор):
Alt+Insert
и там выбрать переопределение метода или конструктор - Чтобы отформатировать код:
Alt+Ctrl+L
- Чтобы запустить редактируемый в данный момент файл:
Ctrl+Shift+F10
- Чтобы IDE подсказала какие методы и поля есть у данного объекта: напечатать
myObject.
(можно еще явно нажатьCtrl+Space
) - Чтобы посмотреть какие аргументы принимает метод: напечатать
g.drawLine(
и нажатьCtrl+P
Вводное задание
Сдача задания: в конце урока не забудьте сохранить код (на флешку, на почту, на диск H) так чтобы у вас был к нему доступ дома для продолжения работы в рамках домашнего задания, и чтобы принести потом на урок результат.
1) Создайте новый проект (сверху слева File -> New -> Project
)
2) Создайте новый класс MyPanel
(разверните сверху слева структуру проекта, там src -> правый клик -> New -> Java Class)
3) Укажите что он наследуется от JPanel
(т.е. добавьте extends: public class MyPanel extends JPanel {
, и импортируйте библиотеку через Alt+Enter - import javax.swing.JPanel;
)
4) Переопределите метод public void paintComponent(Graphics g)
(подобно тому как мы переопределяли toString
) - пусть пока будет без кода внутри
5) Создайте новый класс Main
и в нем main
-функцию и выполните в ней:
- Создайте объект-окно:
JFrame frame = new JFrame()
(и добавьте импорт библиотеки через Alt+Enter:import import javax.swing.JFrame;
) - Сделайте окно видимым:
frame.setVisible(true);
- Проверьте что программа запускается (см. горячую кнопку запуска выше Ctrl+Shift+F10) и создает окошко (пока что очень маленькое)
- Через метод окна
setTitle
укажите название окна и запустите вновь, чтобы проверить что название изменилось (может потребоваться его увеличить, чтобы рассмотреть название) - Если вы что-то не понимаете из того что произошло - позовите меня и спросите
6) Улучшите ваше окошко:
- Сделайте его побольше:
frame.setSize(...);
- Укажите что при закрытии окошка нужно завершить выполнение программы:
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
- Создайте объект - вашу панель:
MyPanel panel = new MyPanel();
- Добавьте эту панель в окно:
frame.add(panel);
- ОБЯЗАТЕЛЬНО сместите вызов
frame.setVisible(true);
так чтобы он был после добавления панели в окно (чтобы окно стало видимым когда оно уже полностью настроено и знает о своем содержимом) - Добавьте в вашем классе
MyPanel
в переопределении методаpaintComponent
рисование отрезка - через методg.drawLine(...)
у объектаGraphics g
(из точки(x=10, y=20)
в точку(x=200, y=100)
) - Проверьте что программа запускается и рисует прямую так, как вы ожидали бы
- Нарисуйте прямоугольник, чья диагональ - это уже нарисованный ранее отрезок (через метод
drawRect(...)
у графики) - Нарисуйте что-нибудь красивое, например единорога (в вашем арсенале еще и
drawOval(...)
, иdrawString(...)
для добавления текста) - Если все хорошо работает - скажите мне, если что-то не работает и вы запутались - иподавно скажите
7) Начните рисовать двигающийся отрезок:
- Метод возвращающий текущее время -
System.currentTimeMillis()
(измеряется в миллисекундах, т.е. в тысячных секунды) - обратите внимание что он возвращает неint
, аlong
- Если она не двигается, то добавьте
System.out.println("paint")
чтобы проверить как часто происходит отрисовка - Оказывается рисование производится всего лишь один раз на старте. Чтобы оно происходило чаще - сделайте в конце
main
-Функции циклwhile (true) { frame.repaint(); }
- Сделайте так, чтобы отрезок вращалась вокруг своей оси (используйте
Math.sin
иMath.cos
)
8) Добавьте цвета:
- Перед вызовом
drawLine
вызовите методg.setColor(Color.green);
- Или вы можете передавать произвольный цвет, созданный через конструктор
new Color(r, g, b)
- И обратите внимание что если вы хотите залить объект - то к вашим услугам например
fillRect
иfillOval
.
9) Можете попробовать заглянуть вперед и начать использовать картинки чтобы собрать интересную анимацию из них.
10) Нарисуйте что-нибудь красивое, например изобразите дождь (по сути отрезки которые в зависимости от времени двигаются сверху вниз):
Или дождь падающий наискосок (с помощью косинусов и синусов):
Или полет сквозь звезды (точки или отрезки удаляющиеся от центра от времени, тоже с помощью косинусов и синусов):
11) Нарисуйте вашего человечка - для этого вам надо добавить в него метод public void paint(Graphics g)
, в котором рисуются нужные его ручки и ножки, а затем вызвать из MyPanel
у этого объекта “человечек” этот метод human.paint(g)