본문 바로가기
Java/자바 Swing

[Java] 64. Swing: 키보드 리스너

글: Song hyun 2024. 4. 30.
728x90
반응형

[Java] 64. Swing: 키보드 리스너

*키보드 리스너Keyboard Listener는 키보드를 눌렀을 때, 호출되는 메서드를 가지는 인터페이스이다.

키보드 리스너에도 다양한 종류가 있는데, 대표적인 것은 아래와 같다.

 

(1) keyTyped: 사용자가 글자를 입력했을 때 호출되는 메서드이다.

(2) keyPressed: 사용자가 키를 눌렀을 때 호출되는 메서드이다.

(3) keyReleased: 사용자가 키를 눌렀다, 뗄 때 호출되는 메서드이다.

 

1. Swing: 키보드 리스너 응용 문제

-상, 하, 좌, 우 방향키를 누를 때마다, 해당 방향을 출력하는 코드를 작성해보자.

(1) getKeyCode();를 통해, 특정 키가 눌러졌을 때 반환되는 keyPressed 값을 알 수 있다.

(2) (1)에서의 결과를 통해, 각각의 방향키가 e.getKeyCode()의 반환 값과 동일한지 비교한 후,

맞으면 방향을 출력하는 if문을 작성한다.

package ch06;


public class MyKeyEventTest{
	
	public static void main(String[] args) {
		new MyKeyEvent();
	}

}
package ch06;

import java.awt.BorderLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JTextArea;

/*
 * 키 이벤트 리스너 사용해보기
 */
public class MyKeyEvent extends JFrame implements KeyListener{

	private JTextArea textArea;

	public MyKeyEvent() {
		initDate();
		setInitLayout();
		addEventListener();
	}

	private void initDate() {
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		super.setResizable(false); // 프레임 사이즈 조절 불가
		textArea = new JTextArea();

	}

	private void setInitLayout() {
		// 좌표 기준으로 셋팅하고 싶다면 null을 넣자.
		setLayout(new BorderLayout());
		add(textArea);
		setVisible(true);
	}

	private void addEventListener() {
		// textArea 위에서 사용자기 키보드를 누르면 감지해서
		// 나에게 (코드 기준) 알려줘
		textArea.addKeyListener(this);
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// 응답 받고 싶다면 1
		//System.out.println(e.toString());
		
	}

	@Override
	public void keyPressed(KeyEvent e) {
		// 응답 받고 싶다면 2
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		final int LEFT=37;
		final int UP=38;
		final int RIGHT=39;
		final int DOWN=40;
		
		if(e.getKeyCode()==LEFT) {
			System.out.println("좌");
		} else if (e.getKeyCode()==UP) {
			System.out.println("상");
		} else if (e.getKeyCode()==RIGHT) {
			System.out.println("우");
		} else if (e.getKeyCode()==DOWN) {
			System.out.println("하");
		} else {
			System.out.println("keyPressed : "+e.getKeyCode());
		}
		// 응답 받고 싶다면 3
		// 문제 1.
		// 제어문을 활용해서, 방향키 위 아래 왼쪽 오른쪽이 눌렀다가 떼면,
		// 콘솔창에 한글로 위 아래 왼쪽 오른쪽 글자를 표기하시오.
		
	}

}

 

 

2. Swing: 키보드 리스너 응용 문제

-상, 하, 좌, 우 방향키를 누를 때마다, 글자를 움직이는 코드를 작성해보자.

 

*컴포넌트의 위치를 나타내는 x,y좌표, 이동 범위에 일반적인 수가 아닌 변수를 선언한다.

아래의 코드를 읽으면 jPlayerX,jPlayerY가 각각 x,y좌표를 나타낸다는 것을 알 수 있다.

움직일 범위를 나타내는 MOVE_INSTANCE는 변하지 않아도 되기 때문에 상수(final)로 선언한다.

 

If문에 입력받은 방향키를 입력하고(ex: 상을 눌렀다면... /하를 눌렀다면... )

해당 방향키를 입력받았을 때, 해당 좌표를 이동시키는 식으로 선언부를 작성한다.

(ex: if(e.getKeycode()==KeyEvent.VK_UP){

    jPlayerY-=MOVE_INSTANCE})

package ch06;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JLabel;

public class MiniGame extends JFrame implements KeyListener {

	private JLabel jPlayer;
	// 변수=변하는 수
	private int jPlayerX = 100;
	private int jPlayerY = 100;
	private final int MOVE_INSTANCE = 5;
	private final int FRAME_WIDTH = 500;
	private final int FRAME_HEIGHT = 500;
	private final String PLAYER_NAME = "야스오";
	private final int PLAYER_WIDTH = 100;
	private final int PLAYER_HEIGHT = 100;

	public MiniGame() {
		initData();
		setInitLayout();
		addEventListener();
		setVisible(true);
	}

	private void initData() {
		setSize(FRAME_WIDTH, FRAME_HEIGHT);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jPlayer = new JLabel(PLAYER_NAME);
		jPlayer.setSize(jPlayerX, jPlayerY);
	}

	private void setInitLayout() {
		// 좌표 기반의 배치 관리자
		setLayout(null);
		add(jPlayer);
		jPlayer.setLocation(PLAYER_WIDTH, PLAYER_HEIGHT);
	}

	private void addEventListener() {
		// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
		// 익명 구현클래스로 KeyListener 인터페이스를 재정의할 수 있다.

		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
				// TODO Auto-generated method stub

			}

			@Override
			public void keyReleased(KeyEvent e) {
				// TODO Auto-generated method stub

			}

			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_UP) {
					jPlayerY -= MOVE_INSTANCE;
				} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
					jPlayerX -= MOVE_INSTANCE;
				} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					jPlayerX += MOVE_INSTANCE;
				} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
					jPlayerY += MOVE_INSTANCE;
				}
				jPlayer.setLocation(jPlayerX, jPlayerY);
			}
		});

	}

	public static void main(String[] args) {
		new MiniGame();
	}

	@Override
	public void keyTyped(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyPressed(KeyEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// TODO Auto-generated method stub

	}

}
728x90
반응형