키 이벤트를 받을 수 있는 조건
=> 컴포넌트가 포커스(focus) 를 가지고 있어야 한다.
컴포넌트가 키 이벤트를 독점하는 권한
컴포넌트가 포커스를 받을 수 있도록 설정해야함
=> 아래와 같은 2문장을 추가하면 key 이벤트를 받을 수 있다!
component.setFocusable(true); // 컴포넌트가 포커스를 받을 수 있도록 설정
component.requestFocus(); // 컴포넌트에 포커스를 강제로 지정
setVisible(true);
component.setFocusable(true);
component.requestFocus();
// 컴포넌트를 마우스로 클릭할때 동작하게 하기 위해 addMouseListener 리스너를 등록해줌
component.addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
Component c = (Component)e.getSource(); // 마우스 클릭 이벤트가 발생한 컴포넌트 참조자가 c 에 저장
c.setFocusable(true); // 이벤트가 발생한 해당 컴포넌트에 대해 포커스를 부여
c.requestFocus();
}
}
component.addKeyListener(myKeyListener);
keyPressed() : 키를 누르는 순간
keyReleased() : 누른 키를 떄는 순간
keyTyped() : 유니코드 키를 눌렀을 때
=> KeyListener 메소드가 실행되는 순서
1) keyPressed : 키를 누르는 순간에 실행
2) keyTyped (유니코드 키가 입력된 경우에만 실행)
3) keyReleased : 누른 키를 떄는 순간에 실행
얻어온 키가 유니코드가 아닌경우 대응하는 문자가 없어서, (ex. F1키 값은 유니코드 값이 없음 ) 대신에 가상 키 코드 라는 것을 받아온다.
키보드의 모든 key는 유니코드가 아닌 key들은 다 가상키가 배정되어있다.
e.getKeyChar() : 눌러진 키에 해당하는 유니코드 리턴
e.getKeyCode() : 입력된 키에 해당하는 가상 키 값을 리턴
e.getKeyText(키 코드값) : 매개변수 keyCode 값(가상 키) 에 해당하는 키의 이름 문자열 리턴
유니코드를 입력했을 떄
keyTyped() 는 유니코드에 대응하는 키 값을 눌렀을 떄 발생한다 했었다.
keyTyped 는 유니코드에만 대응하는 녀석이라서, 이 안에서 getKeyCode() 로 가상 키 값을 얻어오면 항상 0을 리턴함
유니코드 아닌 값을 입력했을 때
( cf. 만일 인터페이스를 구현했다면 keyPressed() 메소드 말고도 keyReleased(), keyTyped() 도 정의해야 했었을 것임 )
리스너를 컴포넌트인 컨텐트팬 에 등록해줌
컨텐트팬에서 키가 눌렸을 때, 그 키에 대한 정보를 레이블 객체 3개에 출력한다.
이 예제는 방향키를 누를때마다 레이블 객체가, 즉 "Hello" 라는 텍스트가 10픽셀씩 움직이는 것이다.
키를 누르는 이벤트가 발생했을때, 눌러진 방향키가 상하좌우 키중 어는 것인지를 비교하기 위해 이벤트 객체 e 의 가상 키값 (= e.getKeyCode()) 와 상화좌우의 가상키값과 비교한다!
리스너 클래스 MyKeyListener 에서 레이블 객체 la 를 그냥 사용할 수 있는 이유는, MyKeyListener 클래스가 FlyingTextEx 클래스의 내부 클래스(안쪽 클래스) 로 선언되었기 때문임
컴포넌트(JLabel 객체) 의 위치를 마음대로 바꾸기위해 배치관리자를 null 로 초기화
마우스 이벤트와 관련한 리스너는 MouseListener 와 MousMotionListener 2가지이다.
MouseListener 리스너의 메소드
MouseMotionListener 리스너의 메소드
MouseWheelListener 리스너의 메소드
(사실 정확히는 리스너 종류가 MouseWheelListener 까지 포함해서 3가지이긴함)
component.addMouseListner(myMouseListener);
component.addMouseListener(myMouseMotionListener);
컨텐트팬에 대한 마우스 이벤트가 발생하는 경우를 구현해봤다.
이벤트 객체 e 의 getClickCount() 를 사용하면 마우스 클릭 횟수를 알 수 있다.
즉, e.getClickCount() == 2 라는 것은 곧 더블클릭이 된 상황이다!