KeyEvent

KeyEvent (키 이벤트)

컴포넌트에서 키 입력(keystroke)이 발생했음을 나타내는 이벤트입니다.

출처: Java API Reference

본문

public non-sealed class KeyEvent extends InputEvent

이 저수준 이벤트는 키가 눌리거나, 놓이거나, 입력될 때 텍스트 필드 같은 컴포넌트 객체에 의해 생성됩니다. 이벤트는 컴포넌트의 addKeyListener 메서드로 그러한 이벤트를 받도록 등록한 모든 KeyListener 또는 KeyAdapter 객체에 전달됩니다. (KeyAdapter 객체는 KeyListener 인터페이스를 구현합니다.) 이벤트가 발생할 때 각 리스너 객체는 이 KeyEvent를 받습니다.

"키 입력"(key typed) 이벤트는 더 고수준이며 일반적으로 플랫폼이나 키보드 레이아웃에 의존하지 않습니다. 유니코드 문자가 입력될 때 생성되며, 문자 입력을 알아내는 선호되는 방법입니다. 가장 단순한 경우 키 입력 이벤트는 단일 키 누름(예: a)으로 생성됩니다. 그러나 종종 문자는 일련의 키 누름(예: shift + a)으로 생성되며, 키 누름 이벤트에서 키 입력 이벤트로의 매핑은 다대일이거나 다대다일 수 있습니다.

키 놓음은 보통 키 입력 이벤트를 생성하는 데 필요하지 않지만, 키가 놓일 때까지 키 입력 이벤트가 생성되지 않는 경우도 있습니다(예: Windows의 Alt-Numpad 방식으로 ASCII 시퀀스를 입력하는 경우). 유니코드 문자를 생성하지 않는 키(동작 키, 수정자 키 등)에 대해서는 키 입력 이벤트가 생성되지 않습니다.

getKeyChar 메서드는 항상 유효한 유니코드 문자나 CHAR_UNDEFINED를 반환합니다. 문자 입력은 KEY_TYPED 이벤트로 보고됩니다. KEY_PRESSEDKEY_RELEASED 이벤트는 반드시 문자 입력과 연관되지는 않으므로 getKeyChar 결과는 KEY_TYPED 이벤트에서만 의미가 보장됩니다.

키 누름·키 놓음 이벤트에 대해 getKeyCode 메서드는 이벤트의 keyCode를 반환합니다. 키 입력 이벤트의 경우 getKeyCode는 항상 VK_UNDEFINED를 반환합니다. getExtendedKeyCode 메서드는 여러 국제 키보드 레이아웃과 함께 사용될 수도 있습니다.

"키 눌림"과 "키 놓음" 이벤트는 더 저수준이며 플랫폼과 키보드 레이아웃에 의존합니다. 키가 눌리거나 놓일 때마다 생성되며, 문자 입력을 생성하지 않는 키(동작 키, 수정자 키 등)를 알아내는 유일한 방법입니다. 눌리거나 놓인 키는 가상 키 코드를 반환하는 getKeyCodegetExtendedKeyCode 메서드로 표시됩니다.

예를 들어 Shift 키를 누르면 VK_SHIFT keyCode의 KEY_PRESSED 이벤트가 발생하고, a 키를 누르면 VK_A의 이벤트가 발생합니다. a 키를 놓으면 VK_AKEY_RELEASED 이벤트가 발생합니다. 별도로 A의 keyChar 값을 가진 KEY_TYPED 이벤트가 생성됩니다.

키보드에서 키를 누르고 놓으면 순서대로 다음 키 이벤트가 생성됩니다: KEY_PRESSED, KEY_TYPED(유효한 유니코드 문자를 생성할 수 있을 때만), KEY_RELEASED. 그러나 일부 경우(예: 자동 반복 또는 입력 방식 활성화)에는 순서가 다를 수 있고 플랫폼에 따라 달라질 수 있습니다.

F1과 HELP 키 같은 액션 키처럼 유니코드 문자를 만들지 않는 키 조합은 KEY_TYPED 이벤트를 생성하지 않습니다. 모든 키보드나 시스템이 모든 가상 키 코드를 생성할 수 있는 것은 아니며, Java는 이 키들을 인위적으로 생성하려 하지 않습니다.

가상 키 코드는 물리적 키를 식별하지 않습니다. 플랫폼과 키보드 레이아웃에 따라 달라집니다. 예를 들어 미국 키보드 레이아웃에서 VK_Q를 생성하는 키는 프랑스어 레이아웃에서 VK_A를 생성합니다. getExtendedKeyCode를 사용하면 이러한 코드를 얻을 수 있습니다.

Java 언어에서 정의한 키(VK_ENTER, VK_BACK_SPACE, VK_TAB)를 제외한 VK_ 상수 값에 의존하지 마세요. 플랫폼 스튜어드는 향후 더 넓은 범위의 키보드를 수용하기 위해 이 값을 필요에 따라 바꿀 권리를 가집니다. 어떤 KeyEvent 인스턴스의 id 매개변수가 KEY_FIRST에서 KEY_LAST 사이가 아니면 동작이 정의되지 않습니다.

더 알아보기 (Learn more)

Java 공식 API