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