[네트워크 프로그래밍2]이벤트 처리 정리

류명운

·

2015. 10. 11. 23:37

반응형

이벤트 기반 프로그래밍(Event Driven Programming)

 - 이벤트의 발생에 의해 프로그램 흐름이 결정되는 방식

  * 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너)이 실행하는 방식

  * 프로그램 내의 어떤 코드가 언제 실행될 지 아무도 모름, 이벤트의 발생에 의해 전적으로 결정

 - 반대되는 개념: 배치 실행(batch programming)

  * 프로그램의 개발자가 프로그램의 흐름을 결정하는 방식

 

이벤트

 - 사용자의 입력: 마우스 드래그, 마우스 클릭, 키보드 누름

 - 센서로부터의 입력

 - 네트워크로부터 데이타 송수신

 - 다른 응용프로그램이나 다른 스레드로부터의 메시지

 

이벤트 기반 프로그램의 구조

 - 프로그램에서 처리하고자 하는 이벤트의 이벤트 처리 리스너 구현

 

이벤트 처리 순서

 1) 이벤트 발생(ex: 마우스나 키보드의 움직임 혹은 입력)

 2) 이벤트 객체 생성

  - 현재 발생한 이벤트에 대한 여러 정보를 가진 객체

 3) 이벤트 리스너 찾기

 4) 이벤트 리스너 호출

  - 이벤트 객체가 리스너에 전달됨

 5) 이벤트 리스너 실행

 

이벤트의 예

 - 마우스로 메뉴 선택, 버튼 클릭(Mouse Event, Action Event)

 - 마우스로 윈도우 크기 조절(Mouse Event, Container Event)

 - 키보드 입력(Key Event)

 - 키보드로 메뉴 선택(key Event, Action Event)

 

자바의 이벤트 기반 GUI 응용프로그램 구성

 1) 이벤트 발생

 2) 자바 가상 기계(JVM)

 3) 이벤트 분배 스레드

 4) ActionEvent 생성

 5) 이벤트 리스너 호출

 6) 이벤트 리스너 실행

 

이벤트 객체란?

 : 이벤트가 발생하면 발생한 이벤트에 관한 정보를 가진 객체

 : 이벤트 리스너에 전달됨

  * 이벤트 리스너에서 이벤트가 발생한 여러 상황을 파악할 수 있게 함

 

이벤트 객체의 종류

 

 

이벤트 객체가 포함하는 정보

 - 이벤트 종류

 - 이벤트 소스

 - 이벤트가 발생한 화면 좌표

 - 이벤트가 발생한 컴포넌트 내 좌표

 - 버튼이나 메뉴 아이템에 이벤트가 발생한 경우 버튼이나 메뉴 아이템의 문자열

 - 클릭된 마우스 버튼 번호

 - 마우스의 클릭 횟수

 - 키가 눌러졌다면 키의 코드 값과 문자 값

 - 체크박스, 라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크 상태

 

이벤트에 따라 조금씩 다른 정보 포함

 - ActionEvent 객체: 액션 문자열

 - MoouseEvent 객체: 마우스의 위치 정보, 마우스 버튼, 함께 눌러진 키 정보 등

 - ItemEvent 객체: 아이템의 체크 상태

 

이벤트 소스 알아 내기

 - object EventObject.getSource()

  * 발생한 이벤트의 소스 컴포넌트를 리턴한다

  * Object 타입으로 리턴하므로 캐스팅하여 사용하는 것을 추천

  * 모든 이벤트 객체에서 제공됨

 

이벤트 객체의 메소드

 - EventObject: Object getSource()

   - AWTEvent

     - ActionEvent: String getActionCommand()

     - ItemEvent: Object getItem(), int getStateChange()

     - ComponentEvent

       - InputEvent: int getModifiers()

         - MouseEvent: int getButton(), int getClickCount(), Point getPoint(), int getX(), int getY()

         - KeyEvent: char getKeyChar(), int getKeyCode(), String getKeyText()

 

이벤트 객체와 이벤트 소스

 이벤트 객체

 이벤트 소스

 이벤트가 발생하는 경우

 ActionEvent

 JButton

 마우스로 버튼을 클릭하거나 키로 버튼을 선택한 경우

 JList

 리스트 아이템을 더블클릭하여 리스트 아이템을 선택한 경우

 JMenuItem

 메뉴 아이템 선택을 선택한 경우

 JTextField

 텍스트 입력 중 <Enter> 키를 누른 경우

 ItemEvent

 JCheckBox

 체크박스의 선택 혹은 해제

 JCheckBoxMenuItem

 체크박스 메뉴 아이템이 선택 혹은 해제 될 때

 JList

 리스트 아이템이 선택될 때

 KeyEvent

 Component

 모든 컴포넌트에 대해, 키가 눌러지거나 눌러진 키가 떼어질 때

 MouseEvent

 Component

 모든 컴포넌트에 대해, 마우스 버튼이 눌러지거나 떼어질 때, 클릭될 때, 컴포넌트 위에 마우스가 올라갈 때, 올라간 마우스가 내려올 때, 마우스가 드래그될 때, 마우스가 단순 움직일 때

 FocusEvent  Component 

 모든 컴포넌트에 대해, 컴포넌트가 포커스를 받거나 잃을 때

 TextEvent  TextField  텍스트가 변경될 때
 TextArea

 텍스트가 변경될 때

 WindowEvent

 Window  Window를 상속받는 모든 컴포넌트에 대해, 윈도우가 활성화, 비활성화, 아이콘화, 아이콘에서 복구 될 때, 윈도우가 열리거나 닫힐 때, 윈도우가 종료될 때 등

 AdiustmentEvent

 JScrollBar  스크롤바를 사용자가 움직였을 때

 ComponentEvent

 Component  모든 컴포넌트에 대해, 컴포넌트가 사라지거나, 나타나거나, 이동하거나 크기 변경 될 때 
 ContainerEvent

 Container

 Container에 컴포넌트가 추가 혹은 삭제되었을 때

 

이벤트 리스너(Event Listener)

 : 이벤트를 처리하는 핸들러

 : 이벤트 리스너는 인터페이스(interface)이다

  * 개발자가 리스너 인터페이스의 모든 추상 메소드 구현 필요

  * 이벤트가 발생하면 이미 약속된 메소드 호출

  * ex) ActionListener 인터페이스

 interface ActionListener{ //아래 메소드를 개발자가 구현해야 함

  public void actionPerformed(ActionEvent e); //Action 이벤트 발생시 호출

 }

  * ex) MouseListener 인터페이스

 interface MouseListener{ //아래 5개 메소드를 개발자가 구현해야 함

  public void mousePressed(MouseEvent e); //마우스 버튼이 눌러지는 순간 호출

  public void mouseReleased(MouseEvent e); //마우스 버튼이 떼어지는 순간 호출

  public void mouseClicked(MouseEvent e); //마우스가 클릭되는 순간 호출

  public void mouseEntered(MouseEvent e); //마우스가 컴포넌트 위에 올라가는 순간 호출

  public void mouseExited(MouseEvent e); //마우스가 컴포넌트 위에서 내려오는 순간 호출

 }

 

이벤트 리스너 등록

 - 이벤트를 받아 처리하고자 하는 컴포넌트에 이벤트 리스너 등록

 - Component.addXXXListener(listener)

   * XXX: 이벤트 명

   * listener: 이벤트 리스너 객체

   * ex: addMouseListener()

 - 이벤트 리스너가 등록된 컴포넌트에만 이벤트 처리 가능

 

리스너 인터페이스와 메소드

 

이벤트 리스너 작성 예

 

버튼에 Mouse 이벤트를 처리하는 예제(mouseEntered, mouseExited 함수 사용)

 

리스너 등록 메소드가 addXXXListener인 이유?

 : 한 컴포넌트는 서로 다른 이벤트에 대한 리스너를 동시에 여러개 가질 수 있다

 : 한 컴포넌트는 한 이벤트에 대해 여러 개의 리스너를 동시에 가질 수 있다

  * 이때, 리스너는 등록된 반대 순으로 모두 실행된다

 

이벤트 리스너 작성 3가지 방법

 1) 독립 클래스로 작성: 이벤트 리스너를 완전한 클래스로 작성

 2) 내부 클래스(inner class)로 작성

 3) 익명 클래스(anonymous class)로 작성

 

독립 클래스로 작성

 : 독립된 클래스로 이벤트 리스너를 작성하여 준다.

 : 이 클래스를 별로의 java 파일로 저장하여도 된다

 

내부 클래스로 작성

 : Action 이벤트 리스너를 내부 클래스로 작성

 : private으로 선언하여 InnerClassListener의 외부에서 리스너를 사용할 수 없게 할 수 있음

 : 리스너에서 InnerClassListener의 멤버에 대한 접근이 용이함

 

익명 클래스로 작성

 : 클래스정의 + 인스턴스 생성을 한번에 작성

 * ex) ActionListener를 구현하는 익명의 이벤트 리스너 작성

 

 

(실습)마우스로 문자열 이동시키기

 * 마우스 버튼을 누르면 마우스가 있는 위치로 "hello" 문자열을 이동시킨다

 * 이벤트와 리스너: MouseEvent와 MouseListener

 * 이벤트 소스: JPanel

 * 구현할 리스너의 메소드: mousePressed() 하나

 * "hello" 문자열 표현 JLabel

 * 컨텐트 팬 : JPanel로 교체, 배치관리자 null로 설정 

 

어댑터(Adapter) 클래스

 - 이벤트 리스너 구현에 따른 부담(리스너의 추상 메소드들을 모두 구현하여야 하는 부담)으로 인하여 어댑터 클래스를 사용

 - JDK에서 제공

 - 이벤트 리스너를 간단히 구현해 놓은 클래스

  : 메소드를 하나만 가진 리스너는 해당 어댑터가 존재하지 않음

 리스너 인터페이스

 어댑터 클래스

 ActionListener

 ItemListener

 AdiustmentListener

 TextListener

  없음

  : 리스너의 모든 메소드가 단순 리턴하도록 구현됨

   MouseAdapter의 예

  class MouseAdapter implements MouseListener {

    public void mousePressed(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    public void mouseClicked(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

  }

 

Key 이벤트와 포커스

 - 키 이벤트는 키를 입력하는 다음 3가지 경우에 발생(메소드 3개)

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

  2) 누른 키를 떼는 순간(keyReleased)

  3) 누른 키를 떼는 순간, Unicode 키가 입력된 경우에만 추가적으로(keyTyped)

  * 키를 누르면 KeyListenr의 메소드가 실행되는 순서 keyPressed, Released, Typed

 * 키 이벤트를 받을 수 있는 조건: 키가 발생한 컴포넌트가 포커스를 가지고 있어야 함

 - 포커스: 키 이벤트를 독점하는 권한

 - 컴포넌트에 포커스 설정 방법: component.requestFocus(); //component가 키 이벤트를 받을 수 있게 함

 - 모든 컴포넌트에 대해 사용자는 키 입력 가능: 키 이벤트는 모든 컴포넌트에 기본적으로 발생 가능

 - 컴포넌트에 키 이벤트 리스너 등록: component.addKeyListener(myKeyListener);

 

유니코드 키의 특징

 : 국제 산업 표준

 : 전 세계의 문자를 컴퓨터에서 일관되게 표현하기 위한 코드 체계

 : 문자들에 대해서만 코드 값이 정의됨(A~Z, a~z, 0~9, !, @, & 등)

 : 문자 키가 아닌 경우에는 통일된 키 코드 값이 없음(<Home>키, <Up>키 등)

 

유니코드 키가 입력되는 경우

 : KeyPressed(), KeyReleased(), KeyType()

 

입력된 키 판별

KeyEvent 객체: 입력된 키 값을 가진 이벤트 객체

KeyEvent의 메소드로 입력된 키 판별

 

* Unicode 키의 문자 값을 판별, char KeyEvent.getKeyChar()

 - 눌러진 키에 해당하는 문자 값 리턴

 - 눌러진 키가 Unicode 문자 키인 경우에만 의미 있음

 

* Unicode 문자 외 모든 키 판별, int KeyEvent.getKeyCode()

 - 눌러진 키에 대한 정수형 키 코드 값 리턴

 - Unicode 문자에 관계 없이, function 키, modifier 키, Control 키, Action 키 등 모든 키에 대해 키 코드 값 리턴

 - 운영체제나 하드웨어에 따라 키 셋은 서로 다름

 - 입력된 키를 판별하기 위해 가상키(Virtual Key) 값과 비교하여야 함

 

 

키 이름 문자열 리턴: String KeyEvent.getKeyText(int keyCode)

 : static

 : keyCode에 해당하는 키의 이름을 문자열을 리턴

 

가상 키(Virtual Key): 가상 키 값은 Key Event 클래스의 상수로 정의됨

 

 eyEvent와 KeyListener의 활용(getKeyCode, getKeyChar, getKeyText)

 setOpaque(true); //바탕색 불투명함 지정

 requestFocus();  //포커스 설정

 if(e.getKeyCode() == KeyEvent.VK_F1)

 

키를 누르면 KeyListenr의 메소드가 실행되는 순서

 ->keyPressed, Released, Typed

마우스가 클릭되어 한 번 드래그될 때 메소드 호출 순서

 ->mousePressed, Dragged, Released, Clicked

 

MouseListener와 MouseMotionListener 사용 예

 contentPane.addMouseListener(new MyMouseListener());

 contentPane.addMouseMotionListener(new MyMouseListener());

 

 class MyMouseListener implements MouseListener, MouseMotionListener{

}

 

더블클릭 이벤트

 public void mouseClicked(MouseEvent e){

  if(e.getClickCount() == 2){// 더블클릭하였을 경우

  }

}

 

 


 

 

 

 

반응형