JAVA/멀티스레드, 이벤트
java) Swing 키보드 이벤트 + Frame창 이미지 이동시키기(+Toolkit)
읽히는 블로그
2024. 5. 30. 10:32
▤ 목차
✔ 이미지 이동시키
⌨ 같은 패키지에 복사
💻 이미지 경로 가져오는 방법
해당 이미지가 존재하는 경로이다. 절대 경로만 가능하다. 복사하면 된다.
✔ 키보드로 이미지 이동시키기
💻 코드로 보기
public class PackMan extends JFrame implements KeyListener {
Image image;
int x = 100, y = 100;
int selImage = 1;
public PackMan() {
super("상하좌우 화살표를 사용하세요");
setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack1.jpg"));
setLayout(null); // 배치관리자 없음
setResizable(false); // 창크기 조절 (못한다)
setBounds(200, 200, 300, 300);
setBackground(Color.WHITE);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addKeyListener(this);
x = getWidth() / 2; // 프레임의 너비의 반
y = getHeight() / 2; // 프레임의 높이의 절반
}
@Override
public void paint(Graphics g) { // 그림은 여기서 그려지고 있다. 그림만 그려지는 곳
// Frame에 뭔가를 그려주는 메소드로 자동 호출
switch (selImage) {
case 1:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\src\\pack7GUI\\pack1.jpg");
break;
case 2:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack2.jpg");
break;
case 3:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack3.jpg");
break;
case 4:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack4.jpg");
break;
case 5:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack5.jpg");
break;
case 6:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack6.jpg");
break;
case 7:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack7.jpg");
break;
case 8:
image = Toolkit.getDefaultToolkit().getImage("C:\\work\\src\\pack7GUI\\pack8.jpg");
break;
}
g.clearRect(0, 0, getWidth(), getHeight());// 그림 전체를 선택 후 clear된다. 잔상이 삭제된다.
g.drawImage(image, x - image.getWidth(this) / 2, y - image.getHeight(this) / 2, this);
}
@Override
public void keyPressed(KeyEvent e) { // 이벤트 처리가 발생하는 곳
// 키보드를 누를때
int key = e.getKeyCode();
// System.out.println("key : " + key);
if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_NUMPAD6) {// 오른쪽 화살표
// System.out.println("go");
selImage = (selImage == 1) ? 2 : 1; // 이미지 변경
// x = x + 10; //없어짐
x = (x < getWidth()) ? x += 10 : -image.getWidth(this);
System.out.println();
}
if (key == KeyEvent.VK_LEFT || key == KeyEvent.VK_NUMPAD4) {// 왼쪽 화살표
selImage = selImage != 3 ? 3 : 4; // 이미지 변경
// x = x - 10;
x = (0 > -x) ? x -= 10 : getWidth();
}
if (key == KeyEvent.VK_DOWN || key == KeyEvent.VK_NUMPAD2) {// 아래쪽 화살표
selImage = selImage != 5 ? 5 : 6; // 이미지 변경
y = (y < getHeight()) ? y += 10 : -image.getHeight(this);
}
if (key == KeyEvent.VK_UP || key == KeyEvent.VK_NUMPAD8) {// 위쪽 화살표
selImage = selImage == 7 ? 8 : 7; // 이미지 변경
y = (0 > -y) ? y -= 10 : getHeight();
}
repaint(); // paint()를 호출한다.
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
public static void main(String[] args) {
new PackMan();
}
}
👏 중요
✔ 관련 사용 메서드 정리
⌨ getKeyCode()
이 이벤트의 키와 연관된 정수 keyCode를 반환합니다.
반환:
• 키보드의 실제 키에 대한 정수 코드.(KEY_TYPED 이벤트의 경우 keyCode는 VK_UNDEFINED입니다.)
🔦 KeyEvent()
구성 요소에서 키 입력이 발생했음을 나타내는 이벤트입니다.
이 하위 수준 이벤트는 키를 누르거나 놓거나 입력할 때 구성 요소 개체(예: 텍스트 필드)에 의해 생성됩니다. 이벤트는 구성 요소의 addKeyListener 메서드를 사용하여 해당 이벤트를 수신하도록 등록된 모든 KeyListener 또는 KeyAdapter 개체에 전달됩니다.(KeyAdapter 객체는 KeyListener 인터페이스를 구현합니다.) 이러한 각 리스너 객체는 이벤트가 발생할 때 이 KeyEvent를 가져옵니다.
💻 repaint()
paint 이 구성 요소가 경량 구성 요소인 경우 이 메서드는 가능한 한 빨리 이 구성 요소의 메서드를 호출합니다 .
그렇지 않은 경우 이 메서드는 update가능한 한 빨리 이 구성 요소의 메서드를 호출합니다 .
참고 : 가장 효율적인 그리기 코드를 작성하는 방법에 대한 정보를 포함하여 AWT 및 Swing에서 활용하는 그리기 메커니즘에 대한 자세한 내용은 AWT 및 Swing에서의 그리기를 참조하세요 .
😊정리
https://docs.oracle.com/en/java/javase/17/docs/api/java.desktop/java/awt/Component.html#repaint()
Component (Java SE 17 & JDK 17)
All Implemented Interfaces: ImageObserver, MenuContainer, Serializable Direct Known Subclasses: Button, Canvas, Checkbox, Choice, Container, Label, List, Scrollbar, TextComponent A component is an object having a graphical representation that can be displa
docs.oracle.com