Java

2024.04.30 Swing - 6 (Key Listener)

정훈5 2024. 4. 30. 10:18

기본 코드 작성

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;

	private final int UP = 38; // 상수를 사용할 수 있다.

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

	private void initData() {
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		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

		System.out.println("KeyEvent : " + e.getKeyCode());

	}

	@Override
	public void keyReleased(KeyEvent e) {
		// 응답 받고 싶다면 3

		// 문제 1
		// 제어문을 활용해서 방향키 위, 아래, 왼쪽, 오른쪽이 눌렀다가 때면
		// 콘솔창에 한글로 위, 아래, 왼쪽, 오른쪽 글자를 표기 하시오
		if (e.getKeyCode() == 37) {
			System.out.println("왼쪽");
		} else if (e.getKeyCode() == UP) { // final int 상수를 사용해도 된다.
			System.out.println("위");
		} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) { // KeyEvent를 사용해도 된다.
			System.out.println("오른쪽");
		} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			System.out.println("아래");
		}

	}
} // end of class

 

결과물

 


 

package ch06;

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

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

public class MiniGame1 extends JFrame {

	private JLabel jPlayer;

	public MiniGame1() {
		initData(); // 메서드
		setInitLayout(); // 메서드
		setEventListener(); // 메서드
	} // 생성자

	private void initData() {
		setSize(500, 500); //
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jPlayer = new JLabel("플레이어1");
		jPlayer.setSize(200, 100);
	}

	private void setInitLayout() {
		// 좌표 기반으로 배치관리자 변경
		setLayout(null);
		add(jPlayer);
		jPlayer.setLocation(100, 100);
		setVisible(true);
	}

	private void setEventListener() {

		// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
		// 익명 구현 클래스로 KeyListener 인터페이스를 재 정의할 수 있다.
		// jPlayer.addKeyListener(this); // 인터페이스 없어서 안됨
		this.addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {

			}

			@Override
			public void keyReleased(KeyEvent e) {

			}

			@Override
			public void keyPressed(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_UP) {
					jPlayer.setLocation(100, 50);
					System.out.println("위");
				} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
					jPlayer.setLocation(50, 50);
					System.out.println("왼쪽");
				} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					jPlayer.setLocation(200, 50);
					System.out.println("오른쪽");
				} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
					jPlayer.setLocation(100, 350);
					System.out.println("아래");
				}
			}
		});

	}

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

}

 

문제 위,아래,왼쪽, 오른쪽 50씩 이동시켜라

package ch06;

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

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

public class MiniGame1 extends JFrame {

	private JLabel jPlayer;
	// 변수는 --> 변하는 수이기도 하다.
	private int jPlayerX = 100;
	private int jPlayerY = 100;
	private final int MOVDE_DISTANCE = 50;
	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 MiniGame1() {
		initData();
		setInitLayout();
		addEventListener();
	}

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

	private void setInitLayout() {
		// 좌표 기반으로 배치관리자 변경
		setLayout(null);
		add(jPlayer);
		jPlayer.setLocation(jPlayerX, jPlayerY);
		setVisible(true);
	}

	private void addEventListener() {
		// jPlayer 객체에게서만 keyListener 동작을 시키고자 한다면
		// 익명 구현클래스로 KeyListener 인터페스를 재 정의할 수 있다.
		// jPlayer.addKeyListener(this);
		addKeyListener(new KeyListener() {
			@Override
			public void keyTyped(KeyEvent e) {}
			@Override
			public void keyReleased(KeyEvent e) {}
			@Override
			public void keyPressed(KeyEvent e) {
				if(e.getKeyCode() == KeyEvent.VK_UP) {
					jPlayerY -= MOVDE_DISTANCE;
				} else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
					jPlayerX -= MOVDE_DISTANCE;
				} else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
					jPlayerX += MOVDE_DISTANCE;
				} else if(e.getKeyCode() == KeyEvent.VK_DOWN) {
					jPlayerY += MOVDE_DISTANCE;
				}
				
				jPlayer.setLocation(jPlayerX, jPlayerY);
			}
		});
	}

	// 코드 테스트
	public static void main(String[] args) {
		new MiniGame1();
	} // end of main

} // end of class

 


images.zip
0.25MB

 

 

package ch06;

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

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class test01 extends JFrame {

	private JLabel backgroundMap;
	private JLabel player1;
	private JLabel player2;
	private JLabel player3;

	private int playerX = 100;
	private int playerY = 100;

	public test01() {
		initData();
		setInitData();
		setEventListner();
	}

	public void setEventListner() {

		addKeyListener(new KeyListener() {

			@Override
			public void keyTyped(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {
			}

			@Override
			public void keyPressed(KeyEvent e) {

				if (e.getKeyCode() == KeyEvent.VK_UP) {
					playerY -= 10;

				} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {

					playerX -= 10;

				} else if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
					playerX += 10;

				} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
					playerY += 10;

				}

				player1.setLocation(playerX, playerY);
				player2.setLocation(playerX, playerY);

			}
		});
	}

	public void initData() {

		setTitle("Swing 6");
		setSize(600, 600);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

//		Icon icon = new ImageIcon("images2/backgroundMap.png"); // 업 캐스팅 된 상태
//		backgroundMap = new JLabel(icon);
		backgroundMap = new JLabel(new ImageIcon("images2/backgroundMap.png"));

		backgroundMap.setSize(1000, 600); // 그림 사이즈 1000 600
		backgroundMap.setLocation(0, 0); // x좌표 0 y 좌표 0 부터 그림을 그려라

//		Icon icon2 = new ImageIcon("images2/playerR.png"); // 업 캐스팅 된 상태
//		player = new JLabel(icon2);
		player1 = new JLabel(new ImageIcon("images2/playerR.png"));

		player1.setSize(100, 45);
		player1.setLocation(300, 180);

		Icon icon3 = new ImageIcon("images2/playerL.png");
		player2 = new JLabel(icon3);

	}

	public void setInitData() {
		// 좌표 기반으로 배치관리자 설정
		setLayout(null);
		add(backgroundMap);
		backgroundMap.add(player1, player2);
		setVisible(true);
		player1.setLocation(playerX, playerY);

	}

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

 

 

결과물