Swing Key Listener - 6

목차

    1. Key Listener 사용

    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() {
    		initData();
    		setInitLayout();
    		addEventListener();
    	}
    
    	private void initData() {
    		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) {
    	}
    
    	@Override
    	public void keyPressed(KeyEvent e) {
    		// System.out.println("keyPressed : " + e.getKeyCode());
    	}
    
    	@Override
    	public void keyReleased(KeyEvent e) {
    		// 문제 1
    		// 제어문을 활용해서 방향키 위 아래 왼쪽 오른쪽이 눌렀다가 때면
    		// 콘솔창에 한글로 위 아래 왼쪽 오른쪽 글자를 표기 하시오
    		if (e.getKeyCode() == KeyEvent.VK_UP) {
    			System.out.println("위");
    		} else if (e.getKeyCode() == KeyEvent.VK_DOWN) {
    			System.out.println("아래");
    		} else if (e.getKeyCode() == KeyEvent.VK_LEFT) {
    			System.out.println("왼쪽");
    		} else if (e.getKeyCode() == KeyEvent.VK_UP) {
    			System.out.println("오른쪽");
    		}
    	}
    }

    2. 미니게임 (오브젝트 움직이기)

    방향키 입력에 따라 움직이는 오브젝트를 화면에 띄워서 움직여라
    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 ONE_STEP = 10;
    	private final int UP_END = 10;
    	private final int LEFT_END = 10;
    	private final int RIGHT_END = 390;
    	private final int DOWN_END = 390;
    
    	public MiniGame1() {
    		initData();
    		setInitLayout();
    		addEventListener();
    	}
    
    	private void initData() {
    		setSize(500, 500);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jPlayer = new JLabel("플레이어1");
    		jPlayer.setSize(100, 100);
    	}
    
    	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) {
    				switch (e.getKeyCode()) {
    				case KeyEvent.VK_UP:
    					System.out.println("위");
    					if (jPlayerY <= UP_END) {
    						jPlayerY = UP_END;
    					} else {
    						jPlayerY -= ONE_STEP;
    					}
    					jPlayer.setLocation(jPlayerX, jPlayerY);
    					break;
    				case KeyEvent.VK_LEFT:
    					System.out.println("왼쪽");
    					if (jPlayerX <= LEFT_END) {
    						jPlayerX = LEFT_END;
    					} else {
    						jPlayerX -= ONE_STEP;
    					}
    					jPlayer.setLocation(jPlayerX, jPlayerY);
    					break;
    				case KeyEvent.VK_RIGHT:
    					System.out.println("오른쪽");
    					if (jPlayerX >= RIGHT_END) {
    						jPlayerX = RIGHT_END;
    					} else {
    						jPlayerX += ONE_STEP;
    					}
    					jPlayer.setLocation(jPlayerX, jPlayerY);
    					break;
    				case KeyEvent.VK_DOWN:
    					System.out.println("아래");
    					if (jPlayerY >= DOWN_END) {
    						jPlayerY = DOWN_END;
    					} else {
    						jPlayerY += ONE_STEP;
    					}
    					jPlayer.setLocation(jPlayerX, jPlayerY);
    					break;
    				}
    			}
    		});
    	}
    
    	// 코드 테스트
    	public static void main(String[] args) {
    		new MiniGame1();
    	} // end of main
    } // end of class
    좌표 기반으로 설정 할때는
    반드시 좌표와 사이즈를 설정해주어야 한다

    3. 미니게임 (그림 위 그림 오브젝트 움직이기)

    package ch06;
    
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class MiniGame2 extends JFrame{
    	
    	JLabel backgroundMap;
    	JLabel player;
    	private int jPlayerX = 500;
    	private int jPlayerY = 535;
    	private final int FRAME_WIDTH = 1000;
    	private final int FRAME_HEIGHT = 600;
    	private final int PLAYER_WIDTH = 50;
    	private final int PLAYER_HEIGHT = 50;
    	private final int MOVE_DISTANCE = 30;
    	private final int UP_END = MOVE_DISTANCE;
    	private final int LEFT_END = 70;
    	private final int RIGHT_END = FRAME_WIDTH - PLAYER_WIDTH - 60;
    	private final int DOWN_END = FRAME_HEIGHT - PLAYER_HEIGHT - MOVE_DISTANCE;
    	
    	public MiniGame2() {
    		initData();
    		setInitLayout();
    		addEventListener();
    	}
    	
    	private void initData() {
    		setSize(FRAME_WIDTH, FRAME_HEIGHT + 38);
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		backgroundMap = new JLabel(new ImageIcon("images/backgroundMap.png"));
    		backgroundMap.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    		backgroundMap.setLocation(0, 0);
    		player = new JLabel(new ImageIcon("images/playerR.png"));
    		player.setSize(PLAYER_WIDTH, PLAYER_HEIGHT);
    		player.setLocation(jPlayerX, jPlayerY);
    	}
    	private void setInitLayout() {
    		setLayout(null);
    		add(backgroundMap);
    		backgroundMap.add(player);
    		setVisible(true);
    	}
    	private void addEventListener() {
    		addKeyListener(new KeyListener() {
    			
    			@Override
    			public void keyTyped(KeyEvent e) {
    			}
    			
    			@Override
    			public void keyReleased(KeyEvent e) {
    			}
    			
    			@Override
    			public void keyPressed(KeyEvent e) {
    				switch (e.getKeyCode()) {
    				case KeyEvent.VK_UP:
    					System.out.println("위");
    					if (jPlayerY <= UP_END) {
    						jPlayerY = UP_END;
    					} else {
    						jPlayerY -= MOVE_DISTANCE;
    					}
    					break;
    				case KeyEvent.VK_LEFT:
    					System.out.println("왼쪽");
    					if (jPlayerX <= LEFT_END + MOVE_DISTANCE) {
    						jPlayerX = LEFT_END;
    					} else {
    						jPlayerX -= MOVE_DISTANCE;
    					}
    					player.setIcon(new ImageIcon("images/playerL.png"));
    					break;
    				case KeyEvent.VK_RIGHT:
    					System.out.println("오른쪽");
    					if (jPlayerX >= RIGHT_END - MOVE_DISTANCE) {
    						jPlayerX = RIGHT_END;
    					} else {
    						jPlayerX += MOVE_DISTANCE;
    					}
    					player.setIcon(new ImageIcon("images/playerR.png"));
    					break;
    				case KeyEvent.VK_DOWN:
    					System.out.println("아래");
    					if (jPlayerY >= DOWN_END) {
    						jPlayerY = DOWN_END;
    					} else {
    						jPlayerY += MOVE_DISTANCE;
    					}
    					break;
    				}
    				player.setLocation(jPlayerX, jPlayerY);
    			}
    		});
    	}
    	
    	// 코드 테스트
    	public static void main(String[] args) {
    		new MiniGame2();
    	}
    }

    Swing 목차로 돌아가기

     

    'Java > Swing 프로젝트' 카테고리의 다른 글

    Swing 스레드 활용 - 8  (0) 2024.05.01
    Swing 로또 게임 만들기 - 7  (0) 2024.04.30
    Swing 이벤트 리스너 - 5  (0) 2024.04.29
    Swing image 위에 image - 4  (0) 2024.04.29
    Swing image 출력 - 3  (0) 2024.04.29