Posted by 김덕태 on November 25, 1997 at 02:14:54:
In Reply to: RE: 키 값 아는 방법 posted by 윤경구 on November 24, 1997 at 20:36:55:
키 이벤트는 keyPressed, keyTyped, keyReleased의 순서로 발생합니다.
TextField와 TextArea는 한글 입력기로부터 입력된 한글문자를 제대로
KeyEvent 객체에 담아주므로, keyPressed로 넘어오는
KeyEvent의 keyChar 값을 읽어보면 입력된 한글을 알아낼 수 있습니다.
그러나, 이들 컴포넌트를 제외한 모든 컴포넌트에서는 시스템 한글 입력기가 만들어주는
한글을 무시하고 영문 문자로만 넘어오기때문에 (제가 아는 한)
넘어오는 영문 문자로부터 한글 문자로 번역해주는 입력기를 만들어야합니다.
(오래전에 이와 같은 방식을 사용하여 자바로 만든 다국어 입력기를 만들어보았으나,
TextField와 TextArea의 버그로 인해 제대로 동작하지 않아 그만 둔 적이 있음.
또한, 썬사에서도 JDK 1.2에서는 모든 컴포넌트에서 시스템 (네이티브) 입력기를
사용할 수 있도록 Input Method API가 구현될 예정이며,
그 이후 버전의 JDK에서는 자바로 만든 다국어 입력기가
제공될 예정입니다.
다국어 입력기가 필요하지도 않고, 한글 입력기도 만들고 싶지도 않으나,
Canvas등의 컴포넌트에서 간단하게라도 한글을 입력받고 싶으시면,
TextField를 이용하는 방법이 있습니다.
즉, 컴포넌트가 focus를 갖게 되었을 때, TextField에 focus를 무조건 보내서
그 TextField에서 발생하는 키 이벤트를 사용하는 것입니다.
(이 방법은 저도 해보지 않았지만...)
다음은 KeyEvent 예제 프로그램이니 참고하십시오.
import java.awt.*;
import java.awt.event.*;
class KeyEventTest2 implements KeyListener
{
public static void main(String[] args)
{ Frame f = new Frame();
Canvas testArea = new Canvas();
// TextField testArea = new TextField();
f.add( testArea, "Center" );
KeyEventTest2 listener = new KeyEventTest2();
c.addKeyListener( listener );
f.setSize(300, 300);
f.setVisible(true);
}
public void keyPressed(KeyEvent ev)
{ print("pressed", ev);}
public void keyReleased(KeyEvent ev)
{ print("released", ev);}
public void keyTyped(KeyEvent ev)
{ print("typed", ev);}
static void print(String type, KeyEvent ev)
{ System.out.println(type
+ ", keyChar: " + ev.getKeyChar()
+ ", keyCode: " + ev.getKeyCode() + "("
+ KeyEvent.getKeyText(ev.getKeyCode())
+ "), modifiers: " + ev.getModifiers() + "("
+ KeyEvent.getKeyModifiersText(ev.getModifiers())
+ "), actionKey: " + ev.isActionKey());
}
}
--
김덕태
http://calab.kaist.ac.kr/~dtkim/java