KeyEvent와 KeyListener
컴포넌트에 키 이벤트 리스너를 등록하기 위해서는 다음과 같이 addKeyListener()메소드를 이용한다.
component.addKeyListener(myKeyListener) |
Key 이벤트가 발생하는 경우 | KeyListener의 메소드 | 리스너 |
키를 누르는 순간 | void keyPressed(KeyEvent e) | KeyListener |
누른 키를 떼는 순간 | void keyReleased(KeyEvent e) | KeyListener |
누른 키를 떼는 순간 (유니코드 키 경우에만 적용) |
void keyTyped(KeyEvent e) | KeyListener |
입력된 키 판별
키 이벤트가 발생하면 입력된 키 정보가 KeyEvent 객체에 담겨져 리스너에게 전달된다. KeyEvent 객체의 다음 2개의 메소드를 입력된 키를 판별할 수 있다.
char KeyEvent.getKeyChar() : 입력된 키의 문자코를 리턴
int KeyEvent.getKeyCode() : 입력된 키에 대한 코드 값(정수형)을 리턴
키를 판별하기 위해서는 반드시 getKeyCode()가 리턴한 키 코드와 가상 키값을 비교해야 한다.
가상 키 | 설명 | 가상키 | 설명 |
VK_0~VK_9 | 0부터 9까지의 키, '0' ~ '9' 유니코드 | VK_LEFT | 왼쪽 방향 키 |
VK_A~VK_Z | A부터 Z까지의 키, 'A' ~ 'Z' 유니코드 | VK_RIGTH | 오른쪽 방향 키 |
VK_F1~VK_F24 | F1 ~ F24까지의 키 코드 | VK_UP | Up 키 |
VK_HOME | Home 키 | VK_DOWN | Down 키 |
VK_END | End 키 | VK_CONTROL | Control 키 |
VK_PGUP | Page Up 키 | VK_SHIFT | Shift 키 |
VK_PGDN | Page Down키 | VK_ALT | Alt 키 |
VK_UNDEFINED | 입력된 키의 코드 값을 알 수 없음 | VK_TAB | Tab 키 |
입력된 키의 키코드, 유니코드, 키의 이름 문자열을 출력해보자.
import javax.swing.*; import java.awt.event.*; import java.awt.*;
public class KeyListenerEx extends JFrame { private JLabel [] keyMessage; // 3개의 메시지를 출력할 레이블 컴포넌트 배열
public KeyListenerEx() { setTitle("keyListener 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane(); c.setLayout(new FlowLayout()); c.addKeyListener(new MyKeyListener());
// 레이블 배열을 3개 생성하고 각 레이블 컴포넌트 생성 keyMessage = new JLabel [3]; // 레이블 배열 생성 keyMessage[0] = new JLabel(" 키 코드 "); keyMessage[1] = new JLabel(" 키 문자 "); keyMessage[2] = new JLabel(" 키 텍스트 ");
// 3개의 레이블 컴포넌트를 컨텐트팬에 부착 for(int i=0; i<keyMessage.length; i++) { c.add(keyMessage[i]); keyMessage[i].setOpaque(true); // 배경색이 보이록 불투명 속성 설정 keyMessage[i].setBackground(Color.YELLOW); // 배경색을 CYAN 색으로 변경 }
setSize(300,150); setVisible(true);
// 컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정 c.setFocusable(true); c.requestFocus(); }
// Key 리스너 구현 class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); // 키 코드 알아내기 char keyChar = e.getKeyChar(); // 키 문자 값 알아내기 keyMessage[0].setText(Integer.toString(keyCode)); // 키 코드 출력 keyMessage[1].setText(Character.toString(keyChar)); // 키 문자 출력 keyMessage[2].setText(KeyEvent.getKeyText(keyCode)); // 키 이름 문자열 출력 System.out.println("KeyPressed"); // 콘솔창에 메소드 이름 출력 } public void keyReleased(KeyEvent e) { System.out.println("KeyReleased"); // 콘솔창에 메소드 이름 출력 } public void keyTyped(KeyEvent e) { System.out.println("KeyTyped"); // 콘솔창에 메소드 이름 출력 } }
public static void main(String [] args) { new KeyListenerEx(); } } |
실행 결과]
'F1' 키를 입력받으면 컨텐트팬의 배경색을 녹색으로 변경하고, '5' 키를 입력하면 노란색으로 변경하는 프로그램을 작성하시오.
import javax.swing.*; import java.awt.event.*; import java.awt.*;
public class KeyCodeEx extends JFrame { private JLabel la = new JLabel(); // 빈 레이블 컴포넌트 생성
public KeyCodeEx() { setTitle("Key Code 예제 : F1키:초록색, % 키 노란색"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane(); c.addKeyListener(new MyKeyListener()); c.add(la); setSize(300,150); setVisible(true);
// 컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정 c.setFocusable(true); c.requestFocus(); }
// Key 리스너 구현 class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { Container contentPane = (Container)e.getSource();
// la에 입력된 키의 키 이름 문자열을 출력하여 사용자에게 보고함 la.setText(KeyEvent.getKeyText(e.getKeyCode())+"키가 입력되었음");
if(e.getKeyChar() == '%') // 입력된 키가 % 인 경우 contentPane.setBackground(Color.YELLOW); else if(e.getKeyCode() == KeyEvent.VK_F1) // 입력된 키가 <F1> 인가 contentPane.setBackground(Color.GREEN); } }
public static void main(String [] args) { new KeyCodeEx(); } } |
실행 결과]
키보드의 방향키를 눌려 "Hello" 문자열을 움직여보자. ( 실행시 x좌표 50, y좌표 50을 초기값으로 설정 )
import javax.swing.*; import java.awt.event.*; import java.awt.*;
public class FlyingTextEx extends JFrame { private final int FLYING_UNIT = 10; // 레이블이 한 번 움직이는 단위는 10픽셀 private JLabel la = new JLabel("HELLO"); // 키 입력에 따라 움직일 레이블 컴포넌트
public FlyingTextEx() { setTitle("상,하,좌,우 키를 이용하여 텍스트 움직이기"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane(); c.setLayout(null); // 컨텐트팬의 배치관리자 삭제 c.addKeyListener(new MyKeyListener()); // 컨텐트팬에 Key 리스너 달기 la.setLocation(50,50); // la의 초기 위치는 (50,50) la.setSize(100,20); c.add(la);
setSize(300,300); setVisible(true);
c.setFocusable(true); c.requestFocus(); //컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정
// 다음 코드는 컨텐트팬에 포커스를 잃은 경우 마우스를 클릭하면 다시 포커스를 얻게 함 c.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { Component c = (Component)e.getSource(); // 마우스가 클릭된 컴포넌트 c.setFocusable(true); c.requestFocus(); // 컴포넌트에게 포커스 설정 } }); }
// Key 리스너 구현 class MyKeyListener extends KeyAdapter { public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); // 입력된 키의 키코드를 알아낸다.
// 키 코드 값(keyCode)에 따라 상,하,좌,우 키를 판별하고 la의 위치를 이동시킨다. switch(keyCode) { case KeyEvent.VK_UP: // UP 키 la.setLocation(la.getX(), la.getY()-FLYING_UNIT); break; case KeyEvent.VK_DOWN: // DOWN 키 la.setLocation(la.getX(), la.getY()+FLYING_UNIT); break; case KeyEvent.VK_LEFT: // LEFT 키 la.setLocation(la.getX()-FLYING_UNIT, la.getY()); break; case KeyEvent.VK_RIGHT: // RIGHT 키 la.setLocation(la.getX()+FLYING_UNIT, la.getY()); break; } } }
public static void main(String [] args) { new FlyingTextEx(); } } |
실행 결과]
'프로그램언어 > 자바' 카테고리의 다른 글
스윙 컴포넌트의 공통 메소드1 (0) | 2020.11.04 |
---|---|
이벤트 리스너 예제3 (0) | 2020.11.04 |
이벤트 리스너 예제1 (0) | 2020.11.03 |
이벤트 처리하기 (0) | 2020.11.02 |
GUI문제1 (0) | 2020.11.02 |