본문 바로가기

언어/JAVA

[JAVA] 이벤트 처리

이벤트 기반 프로그래밍

이벤트 종류 - 마우스 드래그, 클릭, 키보드 누름, 다른 스레드로부터의 메세지 등

 

이벤트 기반 프로그래밍 <-> 배치 실행

이벤트 기반 프로그래밍: 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행

배치 실행: 프로그램의 개발자가 프로그램의 흐름 결정

 

이벤트 기반 프로그램은 이벤트 리스너들의 집합.

 

이벤트 처리 순서

  • 이벤트 발생
  • 이벤트 객체 생성
  • 이벤트 리스너 찾기
  • 이벤트 리스너 호출 - 이벤트 객체가 리스너에 전달
  • 이벤트 리스너 실행

 

이벤트 발생, 리스너 실행 과정

  1. 화면의 버튼 클릭
  2. 운영체제를 거쳐 JVM에 이벤트 전달됨
  3. JVM은 이벤트 분배 스레드에게 이벤트에 관한 정보 보냄
  4. 이벤트 분배 스레드가 이벤트 객체 생성
  5. 이벤트 분배 스레드가 이벤트 리스너 찾아서 호출

 

*이벤트 소스: 이벤트 발생시킨 컴포넌트

 

*이벤트 객체: 발생한 이벤트에 대한 정보를 포함한 객체. 이벤트 종류와 눌러진 키, 좌표 등 정보 포함

 

*이벤트 리스너: 이벤트 처리하는 코드. 클래스로 작성하며, 컴포넌트에 등록되어야 작동 가능함

 

*이벤트 분배 스레드: JVM으로부터 이벤트 발생 통지받고, 이벤트 소스와 이벤트 종류 결정. 적절한 이벤트 객체를 생성하고 이벤트 리스너 찾아 호출

무한 루프 실행한다

 

이벤트 객체

ActionEvent객체 - 버튼, 메뉴 아이템, 텍스트 입력 액션 문자열

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

ItemEvent객체 - 체크, 라디오 아이템의 상태

 

이벤트 소스 알아내기

Object EventObject.getSource()

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

Object타입으로 리턴하므로 캐스팅해서 사용

 

ActionEvent소스 - JButton, JMenuItem, JTextField

ItemEvent소스 - JCheckBox 등

KeyEvent소스 - Component

MouseEvent소스 - Component

 

 

이벤트 리스너 작성을 위한 인터페이스

개발자가 리스너 인터페이스의 추상 메소드를 구현해야한다

이벤트가 발생하면 자바 플랫폼이 리스너 인터페이스의 추상메소드 호출

 

컴포넌트는 다른 이벤트에 대한 리스너를 동시에 가질 수 있다.

컴포넌트는 한 이벤트에 대해 여러 개의 리스너를 동시에 가질 수 있다.(이 때 리스너는 등록된 순서의 반대로 실행)

 

 

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

  • 독립 클래스로 작성 - 이벤트 리스너를 완전한 클래스로 작성. 여러곳에서 리스너 사용할때 적합
  • 내부 클래스로 작성 - 멤버처럼 클래스 내에 작성. 특정 클래스에서만 사용할때 적합
  • 익명 클래스로 작성 - 클래스 이름 없이 간단하게 리스너 작성. 리스너 코드가 매우 간단한 경우 적합

*익명 클래스: 클래스의 정의와 인스턴스 생성을 한 번에 하는 것

 

어댑터클래스

리스너 작성시 추상 메소드들을 모두 구현해야 하는 부담 -> 리스너의 모든 메소드가 단순 리턴하도록 구현된 어댑터 클래스를 이용

class MyMouseAdapter extends MouseAdapter

독립 클래스 작성

 

 

내부 클래스 작성

*내부에서 외부 클래스의 this 쓰는법: InnerClassListener.this

 

익명 클래스 작성

 

키 입력 시 이벤트 발생 순간

1. 키 누르는 순간

2. 누른 키 떼는 순간

3. 누른 키를 떼는 순간(유니코드일때

 

 

키 이벤트 받을 수 있는 조건: 포커스 가진 컴포넌트

포커스: 컴포넌트나 응용프로그램이 키 이벤트를 독점하는 권한

 

setVisible(true); // 셋비저블 이후에 포커스 주어야 한다

component.setFocusable(true);

component.requestFocus();

 

마우스로 컴포넌트 클릭할 때 포커스 지정해주기

componenet.addMouseListener(new MouseAdapter() {

public void mouseClicked(MouseEvent e) {

Component c = (Component)e.getSource();

c.setFocusable(true);

c.requestFocus();

}

});

 

키 종류 두 가지

유니코드 키 - 문자들에 대해서만 정의된다. keyPressed, keyTyped, keyReleased 순 호출

 

유니코드 아닌 키 - 문자 키가 아닌 제어 키. 정의된 유니코드 값어없으며, 키마다 가상 키 코드 값이 정의됨.

keyPressed, keyReleased만 호출된다

 

*가상키는 모든키에정의된다

 

키의 문자코드 알아내기

char KeyEvent.getKeyCahr();

 

'언어 > JAVA' 카테고리의 다른 글

[JAVA] GUI - AWT, SWING  (0) 2021.12.09
[JAVA] 입출력 스트림과 파일 스트  (0) 2021.12.09
[JAVA] 제네릭과 컬렉션  (0) 2021.12.08