▶ 이벤트 객체란?
: 사건이 발생할 때(ex 마우스, 키보드로 무언가를 했을 때) 즉, 이벤트가 발생할 때
발생한 이벤트에 관한 정보를 가진 객체 -> 이벤트 리스너에 전달됨
▶ 이벤트 리스너란?
: 이벤트를 처리하는 코드, 클래스로 작성
JDK에서 이벤트 리스너 작성을 위한 인터페이스 제공
개발자가 리스너 인터페이스의 추상 메소드 구현
이벤트가 발생하면 자바 플랫폼은 리스너 인터페이스의 추상메소드 호출
▶ ActionEvent를 통해 애니메이션처럼 움직이는 이미지 만들기 예제
package kh0104;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.io.IOException;
import java.awt.image.BufferedImage;
class MyPanel1 extends JPanel implements ActionListener {
//final 기호를 사용해 상수로 활용, 이미지의 크기 및 초기위치
private final int WIDTH = 500;
private final int HEIGHT = 300;
private final int START_X = 0;
private final int START_Y = 250;
//이미지 파일을 담기 위한 BufferedImage 객체 변수를 생성
private BufferedImage image;
//타이머 객체도 생성
private Timer timer;
private int x, y;
public MyPanel1() {
//패널 배경식 지정, 패널 크기와 JFrame 크기가 동일
setBackground(Color.WHITE);
setPreferredSize(new Dimension(WIDTH, HEIGHT));
//추천 기본 크기를 알아서 지정
//배치관리자에 따라, 또는 패널, 버튼 컨테이너에 따라
//setSize(), setPreferrendSize() 쓸 수 있는게 다름
setDoubleBuffered(true);//그림을 넣을 메모리 활성화. 없어도 되긴함..
//이미지 파일 객체 생성
File input = new File("c://temp//choon.jpg");
try {
//imput에 가져온 이미지 파일을 버퍼이미지에 저장
image = ImageIO.read(input);
}catch(IOException e) { //예외처리
e.printStackTrace();
} //이미지를 읽는다.
x = START_X;
y = START_Y;
//타이머 생성자, 1이상이면 어떤 값이 들어와도 동일한 결과가 수행되며
//0이하에서는 매우 빠른 속도로 움직인다.
timer = new Timer(1, this);
timer.start(); //타이머 객체를 생성하고 시작
}
//MyPanel1 메소드는 초기 이미지 조건 파일 객체 등 생성만 담당하고
//나머지 이미지의 동작은 모두 아래 메소드들이 하는 것 같다.
@Override
//그래픽을 출력하는 메소드
public void paintComponent(Graphics g) {
//그래픽 객체를 paintComponent 메소드로 이동시킴
//그림그리려면 필수. 첫문장에 나와야함.
super.paintComponent(g);
//이미지를 화면에 그린다.
//drawImage 메소드가 없으면 그림이 생성되지 않는다.
g.drawImage(image, x, y, this);
}
@Override
public void actionPerformed(ActionEvent e) {
//이벤트가 발생하면 좌표를 해당 픽셀 만큼 이동시킴
x += 1;
y -= 1; //y는 -일수록 높아짐
//이미지 객체가 범위를 벗어난 초기 위치로 이동시킴
if(x > WIDTH) {
x = START_X;
y = START_Y;
}
//동작이 완료되면 repaint 메소드로 이미지를 갱신
//repaint 메소드가 없으면 그림이 이동하지 않는다.
repaint();
}
}
//메인 클래스는 JFrame 객체가 된다.
public class E17Animation extends JFrame {
public E17Animation() {
//JPanel 클래스인 MyPanel1의 생성자를 추가한다
add(new MyPanel1()); //패널객체 추가
setTitle("애니메이션 테스트");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(700, 500);
setVisible(true);
}
public static void main(String[] args) {
new E17Animation();
}
}
이렇게 캐릭터가 x축으로 1씩, y축으로 -1씩 움직이는 애니메이션 동작을 만들 수 있다.
'JAVA' 카테고리의 다른 글
[github/깃허브] 리포지토리(repository) 대표 언어 변경하기 (0) | 2022.06.15 |
---|---|
JAVA GUI 컨테이너 배치관리자 유형 (0) | 2022.04.13 |
java 내부클래스를 이용하여 ActionListner 이벤트 만들기 (0) | 2022.04.10 |
JAVA 파일 입출력과 스트림(FileInputStream, InputStreamReader, FileReader) (0) | 2022.04.06 |
java 컬렉션(Collection) shuffle() 메소드를 이용한 간단하나 카드게임 만들기 (1) | 2022.04.05 |
댓글