본문 바로가기

자바공부

자바 KeyEvent & KeyListener, focus, 명품자바프로그래밍10장

728x90
반응형

* 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();
	}
}

실행 결과

 

반응형