[JAVA] GUI(3) - 이벤트 처리

msung99·2022년 5월 31일
0
post-thumbnail

Key 이벤트와 포커스

  • 키를 입력시, 다음의 경우에 key 이벤트가 발생한다.
  1. 키를 누르는 순간 => keyPressed()
  2. 누른 키를 떼는 순간 => keyReleased()
  3. Unicode 에 대응하는 키를 누르는 순간 => keyTyped()
  • 키 이벤트를 받을 수 있는 조건
    => 컴포넌트가 포커스(focus) 를 가지고 있어야 한다.

    포커스(focus)

  • 컴포넌트가 키 이벤트를 독점하는 권한

  • 컴포넌트가 포커스를 받을 수 있도록 설정해야함
    => 아래와 같은 2문장을 추가하면 key 이벤트를 받을 수 있다!

component.setFocusable(true);  // 컴포넌트가 포커스를 받을 수 있도록 설정
component.requestFocus();     // 컴포넌트에 포커스를 강제로 지정

컴포넌트에 포커스 주기

  • 프레임이 생성될 때 setVisible(true) 이후에 포커스를 주는게 좋다 (권장사항)
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();      
  }
}

KeyListener 리스너

컴포넌트에 key 이벤트 리스너 등록

component.addKeyListener(myKeyListener);
  • KeyListener 인터페이스 안에는 3개의 메소드가 있다.
    키를 누르고 떄면 3개 메소드가 모두 호출된다! ( 몰론 keyTyped 는 유니코드 키 입력될때만 호출됨 )

메소드

  1. keyPressed() : 키를 누르는 순간

  2. keyReleased() : 누른 키를 떄는 순간

  3. keyTyped() : 유니코드 키를 눌렀을 때

=> KeyListener 메소드가 실행되는 순서
1) keyPressed : 키를 누르는 순간에 실행
2) keyTyped (유니코드 키가 입력된 경우에만 실행)
3) keyReleased : 누른 키를 떄는 순간에 실행


가상 키

  • 얻어온 키가 유니코드가 아닌경우 대응하는 문자가 없어서, (ex. F1키 값은 유니코드 값이 없음 ) 대신에 가상 키 코드 라는 것을 받아온다.

  • 키보드의 모든 key는 유니코드가 아닌 key들은 다 가상키가 배정되어있다.

    • 가상 키값들은 모두 정수이지만, 사용하기 편하도록 실제 사용시에는 상수값에 대응하는 문자로 사용
    • #define VK_0 1 => 이렇게 한듯?

KeyEvent 객체의 메소드로 입력된 키 판별하기

  • 키가 입력되면(키 이벤트가 발생했을때) 키 정보를 가진 이벤트 객체인 KeyEvent 객체를 생성함
    • 즉, 키 이벤트가 발생했을때 생성되는 KeyEvent 객체로 유니코드 문자와 가상 키 값을 얻어올 수 있다.
  1. e.getKeyChar() : 눌러진 키에 해당하는 유니코드 리턴

  2. e.getKeyCode() : 입력된 키에 해당하는 가상 키 값을 리턴

  3. e.getKeyText(키 코드값) : 매개변수 keyCode 값(가상 키) 에 해당하는 키의 이름 문자열 리턴

    • ex. F1 키를 입력하면 "F1", "SHIFT" 키의 경우 "SHIFT" 등의 문자열 리턴
  • e : 리스너에서 메소드를 정의할때 매개변수로 넣어준 KeyEvent 객체

메소드 특징분석

1. keyPressed( )

  • "F5" 와 같이 유니코드가 아닌 키 값들을 입력했을 때,
    e.getKeyChar() 로 유니코드 값을 얻어올 수 없다.

2. keyTyped( )

  • 유니코드를 입력했을 떄

    • keyTyped() 는 유니코드에 대응하는 키 값을 눌렀을 떄 발생한다 했었다.

    • keyTyped 는 유니코드에만 대응하는 녀석이라서, 이 안에서 getKeyCode() 로 가상 키 값을 얻어오면 항상 0을 리턴함

  • 유니코드 아닌 값을 입력했을 때

    • keyTyped 이라는 이벤트 자체가 발생하지 않음.


예제1

  • KeyAdapter 어댑터 클래스를 상속받아서 필요한 메소드만 오버라이딩함
  • keyCode 값과 keyChar 값을 다 얻어오고 레이블 객체의 속성인 setText() 을 이용해서 문자열로 변환시켜서 레이블에 출력

( cf. 만일 인터페이스를 구현했다면 keyPressed() 메소드 말고도 keyReleased(), keyTyped() 도 정의해야 했었을 것임 )

  • 리스너를 컴포넌트인 컨텐트팬 에 등록해줌

  • 컨텐트팬에서 키가 눌렸을 때, 그 키에 대한 정보를 레이블 객체 3개에 출력한다.


예제2

  • 키를 누르면 배경색 변경하기
    • '%' 문자 키를 인식하기 위해 입력한 키에 대한 유니코드 문자 값을 getKeyChar() 으로 받아옴
    • e.getKeyCode() : shift 키에 대한 코드값 + 숫자 1에 대한 코드값을 각각 따로 받아오고, 최종적으로 5에 대한 코드값만 받을 수 있다.
      그래서 getKeyCode() 로 받아온 키 값은 숫자 키 1 에 대응하는 것이지, '%' 키에 대응하지 않는다!
    • 가상키 값인 KeyEvent.VK_F1 은 숫자 1에 대응함
    => 뭔소린지 이해안가면, 받아온 가상 키 값이 KeyEvent.Vk_F1 이면 배경색을 초록색으로 변경한다고만 알고있자!


예제

이 예제는 방향키를 누를때마다 레이블 객체가, 즉 "Hello" 라는 텍스트가 10픽셀씩 움직이는 것이다.

  • 키를 누르는 이벤트가 발생했을때, 눌러진 방향키가 상하좌우 키중 어는 것인지를 비교하기 위해 이벤트 객체 e 의 가상 키값 (= e.getKeyCode()) 와 상화좌우의 가상키값과 비교한다!

  • 리스너 클래스 MyKeyListener 에서 레이블 객체 la 를 그냥 사용할 수 있는 이유는, MyKeyListener 클래스가 FlyingTextEx 클래스의 내부 클래스(안쪽 클래스) 로 선언되었기 때문임

  • 컴포넌트(JLabel 객체) 의 위치를 마음대로 바꾸기위해 배치관리자를 null 로 초기화

    • null 이 아니면 디폴트 배치관리자에 따라서 정렬을 자동으로 해주기때문

마우스 이벤트와 리스너

리스너 종류

마우스 이벤트와 관련한 리스너는 MouseListener 와 MousMotionListener 2가지이다.


  • MouserListener 리스너의 메소드가 8개임

MouseListener 리스너의 메소드

  • mouseEntered : 마우스 커서를 컴포넌트에 가져다댈때
  • mouseExited : 컴포넌트에 가져자대고 있었던 마우스 커서를 떌때
  • mouseClicked : 마우스를 누르고 때는순간 움직임이 없을때

MouseMotionListener 리스너의 메소드

  • mouseDragged : 마우스 버튼을 누른 상태에서 이동할때
  • mouseMoved : 마우스를 그냥 이동할때

MouseWheelListener 리스너의 메소드

  • mouseWheelMoved : 마우스 휠을 굴릴때

마우스 리스너

  • 마우스 리스너는 2가지 종류로 나뉘므로, 리스너를 등록시에도 2가지 경우로 등록한다.

(사실 정확히는 리스너 종류가 MouseWheelListener 까지 포함해서 3가지이긴함)

  • MouseListener
    • 보유한 메소드 : mouseEntered(), mouseExited(), mousePressed(), mouseReleased(), mouseClicked()
component.addMouseListner(myMouseListener);
  • MouseMotionListener
    • 보유한 메소드 : mouseDragged(), mouseMoved()
component.addMouseListener(myMouseMotionListener);

MouseEvent 객체 속성

  • e.getX(), e.getY() : 마우스 포인터의 위치
  • e.getButton() : 입력된 마우스 버튼 리턴
  • e.getClickCount() : 마우스 클릭 횟수

예제

  • 컨텐트팬에 대한 마우스 이벤트가 발생하는 경우를 구현해봤다.

    • 컨텐트팬에 마우스 리스너 2가지를 모두 등록한다.
      => c.addMouseListener(listener);
      c.addMouseMotionListener(listener);
    • 리스너 인터페이스 2개를 모두 구현시에 클래스로 하나로 구현할 수 있지만, 등록시에는 2번에 나눠서 각각 따로 등록해줘야 한다!


예제

이벤트 객체 e 의 getClickCount() 를 사용하면 마우스 클릭 횟수를 알 수 있다.
즉, e.getClickCount() == 2 라는 것은 곧 더블클릭이 된 상황이다!

profile
블로그 이전했습니다 🙂 : https://haon.blog

0개의 댓글