
- •Зубрицкий Андрей ип-41
- •Основы графики
- •Графика в Java. Пакеты awt и swing. Различные графические компоненты
- •Что можно рисовать?
- •А также посмотрим возможности, которые дает графика в Java:
- •Достоинства:
- •Недостатки:
- •Преимущества библиотеки Swing:
- •Недостатки:
- •Различные графические компоненты
- •2) Создание окошка с текстовым полем и кнопочкой на awt. Переделка его под swing
- •Переделка окошка под swing
- •Добавление различных компонент в окошко
- •Мультик
- •Как создать объект точки?
- •Как начертить прямую линию?
- •Как задать цвет?
- •Как задать цвет фона?
- •Как нарисовать прямоугольник?
- •Как залить прямоугольник цветом?
- •Как нарисовать овал?
- •Как нарисовать дугу?
- •Как нарисовать многоугольник?
- •Как вывести строку?
- •Как задать шрифт?
- •Изображения
- •Дополнительно Фрейм в потоке диспетчеризации событий
- •Введение в компоновку (FlowLayout)
- •Список использованной литературы и интернет-ресурсов
Изображения
Для работы с изображениями в Java используют классы Image и ImageIcon, а также метод getImage(), который получает изображение от ImageIcon.
Рисуется изображение с помощью метода drawImage(Image img, int x, int y,ImageObserver observer).
Пример
Image img = new ImageIcon(“img.jpg”).getImage();
g.drawImage(img, 10, 10 , null);
Помните в начале лекции мы говорили, что научимся в этой лекции создавать анимации, что ж давайте перейдем к созданию собственного мультика.
Итак, создаем класс с исполнительным методом main().
Не забывем подключить библиотеку swing:
import javax.swing.*;
И начинаем с создания фрейма. Создаем фрейм с названием «Cartoon»:
JFrame frame = new Jframe("Cartoon");
Задаем его размеры:
frame.setSize(1370, 730);
Указываем, чтобы при нажатии на кнопку закрыть, приложение закрывалось:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
А также делаем наш фрейм видимым:
frame.setVisible(true);
Теперь создадим новый класс заднего фона Background, этот класс будет панелью и на нем мы будем рисовать нашу графику. Так как класс будет панелью, то он наследует JPanel.
Подключаем в этот класс библиотеки swing и awt:
import javax.swing.*;
import java.awt.*;
public class Background extends JPanel{
}
Внутри тела класса создаем пока что еще пустой конструктор:
public Background(){
}
Теперь давайте установим задний фон нашего мультика. Для этого создаем, изученный нами ранне обьект Imageи получаем изображения из файла, указав путь у нему, а после этого используем методgetImage();
Image img = new ImageIcon("res/background.png").getImage();
Как вы можете помнить рисуем мы в графическом контексте элементов. Поэтому все наши действия по прорисовке мы будем задавать в методе paint();
public void paint(Graphics g){
}
Внутри метода делаем преобразование GraphicsвGraphics2D, а потом с помощьюупомянутого нами методаdrawImage() рисуем изображение в графическом контексте:
public void paint(Graphics g){
g = (Graphics2D) g;
g.drawImage(img, 0, 0, null);
}
Если сейчас вы запустите приложение, то увидите, что задний фон установился.
Теперь давайте нарисуем поверх нашего фона танк. Создадим для него отдельный класс Panzer.
Подключаем библиотеки awt и swing:
import java.awt.Image;
import javax.swing.ImageIcon;
Создаем наш класс:
publicclassPanzer {
}
Теперь нам надо задать изображение нашего танка. Создаем экземпляр класса Image по указанному нами ранее образцу:
Image img = new ImageIcon("res/panzer.png").getImage();
Так как мы хотим, чтобы наш танк находился на траве, мы дожны задать его координаты, по которым будем отрисовывать его:
intx= 100,y= 500;
Так как это мультик, то наш танк будет двигаться.
Вопрос на сообразительность: что нужно сделать чтобы наш танк двигался по горизонтали? (смещение по горизонтали)
Соответсвенно наш танк должен иметь скорость и метод move():
intv= 5;
В методе move() мы задаем смещение танка по координатеxна расстояние, которое равно его скорости. Этот метод будет вызываться каждый промежуток времени, который мы зададим в будущем сами:
public void move(){
x += v;
}
Теперь возвращаемся в класс Background() и в методеpaint() прорисовываем наш танк. Для этого создаем экземляр классаPanzer:
Panzer panzer = new Panzer();
А также прорисовываем наш танк в методе paint():
g.drawImage(panzer.img, panzer.x, panzer.y, null);
Теперь мы хотим, чтобы на танк двигался, для этого мы должны менять его координаты по xкаждый раз в определенном промежутке времени. Тоесть, мы должны вызывать написанный нами методmove() каждыеnединиц времени. Это позволяет сделать классTimer, конструктор которого в качестве параметров принимает задержку в миллисекундах, а также слушатель событийActionListener(), сейчас мы разберем что это такое:
Timer timer = new Timer(20, this);
Событие - это специальный объект, описывающий изменение состояния источника. Это может быть, например, щелчок кнопки, ввод символа с клавиатуры. Событие может происходит и без участия пользователя,как в нашем случае, а именно - при использовании таймера.
Слушатель (listener) - это объект, уведомляемый о событии. Он должен быть зарегистрирован источником событий и реализовывать методы для получения и обработки уведомлений.
Класс-слушатель cобытий ActionListenter должен определять методы объявленные в интерфейсе ActionListener и работать с объектами событий. В нашем случае, это всего один метод actionPerformed, который имеет один параметр - объектная ссылка на объект класса ActionEvent.
Итак, указываем что наш класс Background реализовывает интерфейс ActionListener
public class Background extends JPanel implements ActionListener{
}
Так мы должны реализовать интерфейс ActionListener, то следует переопределить метод actionPerformed(), именно в нем мы зададим движение танка:
public void actionPerformed(ActionEvent e){
}
Наш танк будет двигаться до определенного пункта назначения.
Вопрос во время лекции:что надо сделать, чтобы танк двигался до определенной точки?
(вызвать метод move() пока танк не достигнет определеннойкоординаты)
Тан будет двигаться до того времени, пока не достигнет координаты x - 400, поэтому пишем условие и вызываем метод move():
public void actionPerformed(ActionEvent e){
if(panzer.x < 400){
panzer.move();
}
}
Так как танк двигается, то мы должны постоянно перерисовывать нашу панель, для этого вызываем метод repaint()
public void actionPerformed(ActionEvent e){
if(panzer.x < 400){
panzer.move();
}
repaint();
}
Теперь осталось запустить наш таймер в конструкторе класса:
public Background(){
timer.start();
}
Вот мы и создали танк, который движется. Можете запустить и проверить.
Танк что должен делать? Правильно, стрелять. Сейчас создадим вражеский танк, в который наш танк будет стрелять.
Создаем класс Enemyи по раннее указанному образцу добавляем поле с изображением нашего танка, а также его координатыпоxиy:
public class Enemy {
Image img = new ImageIcon("res/enemy.png").getImage();
int x = 900, y = 500;
}
Теперь в классе Background создаем экземпляр класса Enemy, после чего отрисовываем его в методеpaint():
Enemy enemy = new Enemy();
g.drawImage(enemy.img, enemy.x, enemy.y, null);
Итак теперь давайте создадим снаряд, которым наш танк будет стрелять во вражеский, когда доедет до него. Создаем отельный класс Bullet для снаряда, так же как и ранее создаем его изображение, координаты x,y, его скорость, а также методmove(), в котором изменяется координата :
public class Bullet {
Image img = new ImageIcon("res/bullet.png").getImage();
int v = 8;
int x = 700 , y = 490;
public void move(){
x += v;
}
}
Теперь опять жев классе Background создаем экземпляр класса Bullet:
Bullet bullet = new Bullet();
Пуля должна появиться и начать двигаться, когда наш танк уже остановился, а закончить двигаться – когда достигнем вражеского танка. Имеем двойное условие для координат xтанка и пули, которое задает когда пуле надо отрисовываться:
if(panzer.x >= 400 && bullet.x < 850){
g.drawImage(bullet.img, bullet.x, bullet.y, null);
}
После того, как мы указали когда отрисовываться нашей пуле, зададим ее движение в методе actionPerformed() до того времени пока она не достигнет вражеского танка:
if(bullet.x < 850){
bullet.move();
}
Теперь давайте сделаем так, что когда пуля попадает во вражеский танк, то он исчезает и на его месте появляется огонь, причем огонь будет уже готовой gif-анимацией. ВJavaподдерживаются анимацииgif. Для этого создаем экземпляр классаImageс гифкой огня:
Image gif = new ImageIcon("res/fire.gif").getImage();
Приэтом отрисовываться в методеpaint() огонь должен, только когда снаряд достигнет вражеского танка и тот исчезнет. Для этого прописываем условие, в котором будем ориентироваться на координатуxснаряда. Если пуля не долетела до вражеского танка, то отрисовываем вражеский танк, если же долетела, то отрисовываем огонь:
if(bullet.x < 850){
g.drawImage(enemy.img, enemy.x, enemy.y, null);
}
else{
g.drawImage(gif, 850, 350, null);
}
Вот наш мультик почти уже готов, осталось оповестить всех, о том он со счастливым концом – HappyEnd. Для этого в методеpaint() там, где мы отрисовываем наш огонь, устанавливаем цветColor(245, 245, 245) и шрифтFont("Arial", Font.BOLD , 40), после чего выводим нашу строчу. Это все мы уже умеем:
g.setColor(new Color(245, 245, 245));
g.setFont(new Font("Arial", Font.BOLD , 40));
drawString("HAPPY END", 600, 100);
Вот и все, наш мультик готов и заканчивается он счастливым концом, также как и наш курс поJava. Огромное спасибо за внимание.
Если мы объединим все вышесказанное в один код, то получится следующее:
Класс Main с исполнительным методом main
import javax.swing.*;
public class Main {
public static void main(String args[]){
JFrame frame = new JFrame("Cartoon");
frame.setSize(1370, 730);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new Background());
frame.setVisible(true);
}
}
Класс заднего фона Background
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Background extends JPanel implements ActionListener{
Timer timer = new Timer(20, this);
Image img = new ImageIcon("res/background.png").getImage();
Image gif = new ImageIcon("res/fire.gif").getImage();
Panzer panzer = new Panzer();
Enemy enemy = new Enemy();
Bullet bullet = new Bullet();
public Background(){
timer.start();
}
public void paint(Graphics g){
g = (Graphics2D) g;
g.drawImage(img, 0, 0, null);
g.drawImage(panzer.img, panzer.x, panzer.y, null);
if(bullet.x < 850)
g.drawImage(enemy.img, enemy.x, enemy.y, null);
else{
g.drawImage(gif, 850, 350, null);
g.setColor(new Color(245, 245, 245));
g.setFont(new Font("Arial", Font.BOLD , 40));
g.drawString("HAPPY END", 600, 100);
}
if(panzer.x >= 400 && bullet.x < 850){
g.drawImage(bullet.img, bullet.x, bullet.y, null);
}
}
public void actionPerformed(ActionEvent e){
if(panzer.x < 400){
panzer.move();
}
else if(bullet.x < 850){
bullet.move();
}
repaint();
}
}
Класс танка Panzer
import java.awt.Image;
import javax.swing.ImageIcon;
public class Panzer {
Image img = new ImageIcon("res/panzer.png").getImage();
int x = 100, y = 500;
int v = 5;
public void move(){
x += v;
}
}
Класс вражеского танка Enemy
import java.awt.Image;
import javax.swing.ImageIcon;
public class Enemy {
Image img = new ImageIcon("res/enemy.png").getImage();
int x = 900, y = 500;
}
Класс снаряда Bullet
import java.awt.Image;
import javax.swing.ImageIcon;
public class Bullet {
Image img = new ImageIcon("res/bullet.png").getImage();
int v = 8;
int x = 700 , y = 490;
public void move(){
x += v;
}
}
Мини-тест по видеолекции (3 задачи)
Нарисуйте с помощью примитивных фигур, изученных в даной видеолекции
Нарисуйте с помощью примитивных фигур следующий цветной рисунок
Создайте свою анимацию, в которой задним фоном будет растровое изображение с полянкой, по полянке катится колобок, когда он докатится до лисицы, то садится ей на нос, после чего исчезает (колобок и лисица - также растровые изображения).
Тест по итогам недели (15 вопросов, из них 5 – на написание кода)
__________________класс для использования ввода многострочного текста. a) TextArea b) TextField c) List d) Comment
С помощью какого метода можно получить экземпляр графического контекста?
draw()
get()
paint()
graphic()
Какой размер по-умолчанию имеет фрейм?
Создайте програмку с графическим интерфейсом, в которой проводится соц. опрос(Примерно 5-6 вопросов с радиокнопками и флажками в качестве вариантов ответов)
Что надо передедать в качестве второго параметра при вызове даного конструктора?
JLabel label = new JLabel(“Ваше имя”, ……..);
Размер метки в количестве символов
По какой стороне выровнять содержимое метки
Название шрифта
Цвет, которым будет написан текст
С помощью примитивных фигур Graphics или Graphics2D создайте фрейм со следующим рисунком:
Что принимает в качестве параметров метод g.drawRect()
Координаты верхнего угла и длины диагоналей
Координаты центра, а также длину и высоту
Координаты верхнего левого угла прямоугольника, длину и высоту
Координаты каждой из вершин
Вставьте растровое изображение и на его фоне с помощью drawstring напишите какой-то текст с шрифтом Tahoma размер 36.
Какой компонент подходит для многовариантного ответа
Кнопка-переключатель
Комбинированный список
Флажок
Метка
Нарисуйте график функции y = x^2.
Создайте анимацию длительностью 10 сек, в которой кораблик, который проплывает мимо острова с пальмой стреляет в пальму, после чего она горит.
Можно ли непосредственно создать экземпляры класса Graphics или Graphics2D.
Какой класс ипользуется для панели прокрутки?
Scroll
ScrollPane
Scrolling
ScrollPanel
Где находится начало системы координат в графическом контексте?
В правом верхнем углу
По центру
В нижнем левом углу
В левом вернем углу
Создайте цветной рисунок домика с забором вокруг, а также деревьями с помощью примитивных фигур.