[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
}
}
'Java > 자바 Swing' 카테고리의 다른 글
[Java] 66. Swing: 랜덤 숫자 게임 만들기 (0) | 2024.04.30 |
---|---|
[Java] 65. Swing: 키보드 리스너 응용하기 (0) | 2024.04.30 |
[Java] 63. Swing: 리스너 응용-리스너를 구현하는 두 가지 방법 (0) | 2024.04.29 |
[Java] 62. Swing: 이벤트 리스너 (0) | 2024.04.29 |
[Java] 61. Swing: 이미지 겹치기 (0) | 2024.04.29 |