이벤트 기반 프로그래밍
이벤트 종류 - 마우스 드래그, 클릭, 키보드 누름, 다른 스레드로부터의 메세지 등
이벤트 기반 프로그래밍 <-> 배치 실행
이벤트 기반 프로그래밍: 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행
배치 실행: 프로그램의 개발자가 프로그램의 흐름 결정
이벤트 기반 프로그램은 이벤트 리스너들의 집합.
이벤트 처리 순서
- 이벤트 발생
- 이벤트 객체 생성
- 이벤트 리스너 찾기
- 이벤트 리스너 호출 - 이벤트 객체가 리스너에 전달
- 이벤트 리스너 실행
이벤트 발생, 리스너 실행 과정
- 화면의 버튼 클릭
- 운영체제를 거쳐 JVM에 이벤트 전달됨
- JVM은 이벤트 분배 스레드에게 이벤트에 관한 정보 보냄
- 이벤트 분배 스레드가 이벤트 객체 생성
- 이벤트 분배 스레드가 이벤트 리스너 찾아서 호출
*이벤트 소스: 이벤트 발생시킨 컴포넌트
*이벤트 객체: 발생한 이벤트에 대한 정보를 포함한 객체. 이벤트 종류와 눌러진 키, 좌표 등 정보 포함
*이벤트 리스너: 이벤트 처리하는 코드. 클래스로 작성하며, 컴포넌트에 등록되어야 작동 가능함
*이벤트 분배 스레드: 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 |