Полезные горячие кнопки в 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)

12) Еще примеры вдохновения: