-
java) Swing 키보드 이벤트 + Frame창 이미지 이동시키기(+Toolkit)JAVA/멀티스레드, 이벤트 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()
'JAVA > 멀티스레드, 이벤트' 카테고리의 다른 글
java) Swing 코드 연습 ( JFrame 사용 ) + Mnemonic (0) 2024.05.29 java) 메모장 만들기 2) 나가기, 복사, 붙여 넣기, 잘라내기, 삭제, 글꼴크기, 모달창 띄우기 (0) 2024.05.28 java) 메모장 만들기 3) 윈도우 계산기 띄우기, 브라우저 실행하기, 팝업 메뉴 (+Desktop 클래스 / URI 클래스) (0) 2024.05.28 java) 메모장 만들기 1) 메뉴 + 열기 + 저장 (0) 2024.05.27 java 리스너 이벤트 처리 방법 (익명 객체, 내부 클래스) (0) 2024.05.24