* Key 이벤트는 사용자가 키를 입력할 때 발생하는 이벤트이다. 모든 컴포넌트가 Key 이벤트를 받을 수 있다.
다만 조건이 하나 있다.
응용프로그램 내에 포커스(focus)를 가진 컴포넌트가 키 입력을 독점하기 때문에 현재 포커스를 가진 컴포넌트에만 key 이벤트가 발생한다.
만일 버튼을 누르기 위해 <Enter> 키를 입력하더라도 그 버튼이 포커스를 가지고 있지 않다면 Key 이벤트가 발생하지 않는다.
어떤 컴포넌트에게 키를 입력하고 한다면 <Tab> 키나 마우스 클릭을 통해 포커스를 그 컴포넌트에게 이동시켜야 한다.
Component component;
component.requestFocus();
// 응용 프로그램에서 강제로 임의의 컴포넌트에 포커스를 주기 위한 방법
* setFocusable() 메소드는 true를 인자로 줄 경우 컴포넌트가 포커스를 받을 수 있도록 하고 false를 인자로 호출하면 포커스를 받지 못하도록 설정한다.
포커스를 받을 수 있는 여러 개의 컴포넌트 중 오직 하나만 포커스를 받고 키 입력을 가져갈 수 있다.
그러나 스윙 응용프로그램에서 한 컴포넌트에 대해서 setFocusable(true);를 실행하면 일차적으로 이 컴포넌트가 포커스를 가지게 되고 처음부터 키 입력을 받을 수 있다.
* 현재 응용프로그램에서 키 입력이 잘 되지 않는다면 일차적으로 키를 받아야 하는 컴포넌트에 포커스가 제대로 설정되어 있는지 확인해봐야 한다.
* 모든 키에 대해서 '키를 누루는 순간', '누른 키를 떼는 순간',에 각각 key 이벤트가 한 번씩 발생하며, 특별히 유니코드 키(문자 키)인 경우에는 '누른 키를 떼는 순간'에 Key 이벤트가 한 번 더 발생한다.
이 3가지 경우에 대해 각각 KeyListener의 메소드가 호출된다.
* Key 이벤트가 발생하는 경우와 호출되는 KeyListener 메소드
* 유니코드(Unicode)란 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다루고자 설계된 국제 산업 표준이다.
유니코드는 한글, 영어 알파벳 등 세계 여러 나라들의 문자들에 대해 코드값을 정의하고 있다.
그러니 <Function>키, <Home>키, <Up> 키 등 문자가 아닌 운영체제나 키보드 의존적인 키의 코드 값은 정의하지 않는다.
* 컴포넌트에 키 이벤트 리스너를 등록하기 위해서는 addKeyListener() 메소드를 이용한다.
component.addKeyListener(myKeyListener);
* Key 이벤트가 발생하는 경우와 KeyListener의 메소드
Key 이벤트가 발생하는 경우 | KeyListener의 메소드 | 리스너 |
키를 누르는 순간 | void keyPressed(KeyEvent e) | KeyListener |
누른 키를 떼는 순간 | void keyReleased(keyEvent e) | KeyListener |
누른 키를 떼는 순간 (유니코드 키 경우에만 추가적으로) |
void keyTyped(KeyEvent e) | KeyListener |
* KeyEvent 객체는 입력된 키 값을 리턴하는 두 개의 메소드를 제공한다.
1) char KeyEvent.getKeyChar()
2) int KeyEvent.getKeyCode()
두 개의 메소드는 입력된 키를 판별하는 데 이용된다.
1) char KeyEvent.getKeyChar()
입력된 키의 유니코드 문자 값을 리턴한다.
유니코드 키가 아닌 경우에는 KeyEvent.CHAR_UNDEFINED를 리턴한다.
public void keyPressed(KeyEvent e){
if(e.getKeyChar() == 'a')
System.exit(0); // 키 a가 눌러지면 프로그램을 종료한다.
}
2) int KeyEvent.getKeyCode()
이 메소드는 유니코드 키를 포함한 모든 키에 대해 정수형의 키 코드(key code) 값을 리턴한다.
키 코드는 운영체제나 하드웨어에 따라 서로 다를 수 있기 때문에 입력된 키를 판별하기 위해서는 읽을 키 코드 값과 JDK에서 정의된 가상 키(Virtual Key)값을 서로 비교하여야 한다.
가상 키는 KeyEvent 클래스에 VK_로 시작하는 static 상수로 선언되어 있다.
public void keyPressed(KeyEvent e){
if(e.getkeyCode() == KeyEvent.VK_F5)
System.exit(0); // <F5> 키가 눌러지면 프로그램을 종료한다.
}
* KeyEvent 클래스의 getKeyChar()와 getKeyCode() 메소드 사용 예시
가상 키 | 설명 | 가상 키 | 설명 |
VK_0 ~ VK_9 | 0에서 9까지의 키, '0'~'9' 까지의 ASCII 값과 동일 |
VK_LEFT | 왼쪽 방향 키 |
VK_A ~ VK_Z | A에서 Z까지의 키, 'A'~'Z' 까지의 ASCII 값과 동일 |
VK_RIGHT | 오른쪽 방향 키 |
VK_F1 ~ VK_F24 | <Function> 키. 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> 키 |
package Ch10;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class KeyListenerEx extends JFrame{
JPanel contentPane = new JPanel(); // 컨텐트팬으로 사용할 패널
JLabel [] keyMessage; // 3개의 메시지를 출력할 레이블 컴포넌트 배열
KeyListenerEx(){
setTitle("KeyListener 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(contentPane);
contentPane.addKeyListener(new MyKeyListener());
// 레이블 배열 3개 생성하고 각 레이블 컴포넌트 생성
keyMessage = new JLabel[3]; // 레이블 배열 생성
keyMessage[0] = new JLabel(" getKeyCode() ");
keyMessage[1] = new JLabel(" getKeyChar() ");
keyMessage[2] = new JLabel(" getKeyText() ");
// 3개의 레이블 컴포넌트를 컨텐트팬에 부착
for(int i=0; i<keyMessage.length; i++) {
contentPane.add(keyMessage[i]);
keyMessage[i].setOpaque(true);
keyMessage[i].setBackground(Color.cyan);
}
setSize(300,150);
setVisible(true);
// 컨텐트팬이 키 입력을 받을 수 있도록 포커스 강제 지정
contentPane.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(e.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();
}
}
'자바공부' 카테고리의 다른 글
자바 Mouse 이벤트, 명품자바프로그래밍10장 (0) | 2022.07.25 |
---|---|
명품자바프로그래밍 10장, 자바의 이벤트 처리 요약 (0) | 2022.07.25 |
자바 어댑터 클래스(Adapter), 명품자바프로그래밍10장 (0) | 2022.07.25 |
자바 이벤트 리스너 작성 방법, 명품자바프로그래밍10장 (0) | 2022.07.25 |
자바 이벤트 리스너, 명품자바프로그래밍10장 (0) | 2022.07.25 |