이벤트 기반 프로그래밍
이벤트 기반 프로그래밍은 이벤트의 발생에 의해 프로그램 실행 흐름이 결정되며 각 이벤트마다 처리하는 이벤트 리스너 코드를 보유하고 있다.
- 순서
- 사용자가 마우스로 화면에 있는 버튼을 클릭
- 버튼클릭으로 JVM에 전달
- JVM은 이벤트 분배 스레드에게 버튼 클릭에 관한 정보를 보냄 * 이벤트 분배 스레드: 이벤트가 발생하면 이벤트 리스너를 찾아 호출하는 스레드
- 이벤트 분배 스레드는 이벤트 객체를 생성 * 이벤트 객체: 발생한 이벤트에 대한 여러 정보를 제공하는 객체
- 이벤트 분배 스레드는 이벤트 소스에 연결된 이벤트 리스너를 찾아 실행 * 이벤트 소스: 이벤트 객체내에서 이벤트를 발생시킨 컴포넌트 *이벤트 리스너: 이벤트 처리 코드로 클래스로 작성
- 이벤트 분배 스레드는 이벤트 리스너로 리턴 한 후 다음 이벤트 발생 대기
** Object getSource() - 어떤 컴포넌트에 이벤트가 발생했는지 이벤트 소스를 알려주는 메서드
버튼 컴포넌트에서 발생한 경우: JButton b=(JButton)event.getSource();
이벤트 객체
이벤트 객체는 현재 발생한 이벤트에 관한 여러 정보를 가진 객체이며, 이벤트 리스너에게 전달된다.
- 이벤트 객체와 이벤트 소스
이벤트 객체 | 이벤트 소스 | 이벤트 발생하는 경우 |
ActionEvent | JButton | 마우스나 엔터키로 버튼 선택 |
JList | 리스트 아이템을 더블 클릭하여 리스트 아이템을 선택 | |
JMenuItem | 메뉴 아이템 선택 | |
JTextField | 텍스트 입력 중에 엔터 키 입력 | |
ItemEvent | JCheckBox | 체크박스 선택 및 해제 |
JRadioButton | 라디오 버튼의 선택 상태 변경 시 | |
JCheckBoxMenuItem | 체크박스 메뉴 아이템 선택 및 해제 | |
JList | 리스트 아이템 선택 | |
KeyEvent | Component | 키가 눌러지거나 눌러진 키를 뗄 때 |
MouseEvent | Component | 마우스 버튼이 눌러지거나 떼어질 때 마우스 버튼이 클릭 될 때 컴포넌트 위에 마우스가 올라갈 때 올라간 마우스가 내려올 때 마우스가 드래그 될 때 마우스를 움직였을 때 |
FocusEvent | Component | 컴포넌트가 포커스를 받거나 잃을 때 |
TextEvent |
TextField | 텍스트 변경 |
TextArea | 텍스트 변경 | |
WindowEvent | Window | window를 상속받는 모든 컴포넌트에 대해 윈도우 활성화, 아이콘화, 아이콘에서 복구, 윈도우 열기 닫기 종료 |
사용자 이벤트 리스너 작성
이벤트 리스너란 이벤트를 처리하는 코드로서 클래스로 작성된다. 자바는 이벤트 리스너 인터페이스를 제공하며 개발자는 인터페이스를 상속받고 추상메소드를 구현하여 이벤트 리스너를 작성한다.
이벤트 부착 메서드: add???Listener();
- 이벤트 리스너 인터페이스
이벤트 종류 | 리스너 인터페이스 | 리스너의 추상메소드 | 메소드가 호출되는 경우 |
Action | ActionListener | actionPerformed(ActionEvent) | Action 이벤트 발생 |
Item | ItemListener | itemStateChanged(ItemEvent) | Item 이벤트 발생 |
Key | KeyListener |
keyPressed(KeyEvent) | 키가 눌러질 때 |
keyReleased(KeyEvent) | 눌러진 키가 떼어질 때 | ||
keyTyped(KeyEvent) | 유니코드 키가 입력될 때 | ||
Mouse | MouseListener |
mousePressed(MouseEvent) | 마우스 버튼이 눌러질 때 |
mouseReleased(MouseEvent) | 눌러진 마우스 버튼이 떼어질 때 | ||
mouseClicked(MouseEvent) | 마우스 버튼이 클릴될 때 | ||
mouseEntered(MouseEvent) | 마우스가 컴포넌트 위에 올라갈 때 | ||
mouseExited(MouseEvent) | 컴포넌트 위에 올라간 마우스가 컴포넌트를 벗어날 때 | ||
Mouse | MouseMotionListener | mouseDragged(MouseEvent) | 마우스를 컴포넌트 위에서 드래그 할 때 |
mouseMoved(MouseEvent) | 마우스가 컴포넌트 위에서 움질일 때 | ||
Focus | FoucsListener | focusGained(FocusEvent) | 컴포넌트가 포커스를 받을 때 |
focusLost(FocusEvent) | 컴포넌트가 포커스를 잃을 때 | ||
Text | TextListener | textValueChanged(TextEvent) | 텍스트가 변경될 때 |
Window | WindowListener | windowOpened(WindowEvent) | 윈도우가 생성되어 처음으로 보이게 될 때 |
windowClosing(WindowEvent) | 윈도우의 시스템 메뉴에서 윈도우 닫기를 시도할 때 | ||
windowIconfied(WindowEvent) | 윈도우가 아이콘화 될 때 | ||
windowDeiconfied(WindowEvent) | 아이콘 상태에서 원래 상태로 복구 할 때 | ||
windowClosed(WindowEvent) | 윈도우가 닫혔을 때 | ||
windowActivated(WindowEvent) | 윈도우가 활성화될 때 | ||
windowDeactivated(WindowEvent) | 윈도우가 비활성화될 때 |
ex) ActionListener의 경우
- 이벤트 리스너 작성 방법 1 (클래스로 작성)
- 목적에 따른 이벤트와 리스너 인터페이스 선택
- 리스너 인터페이스를 상속한 클래스를 작성하고 추상 메서드를 구현
-
123456public class MyactionListener implements ActionListener {public void actionPerformed(ActionEvent e){......구현...}}
cs - 이벤트를 받을 GUI 컴포넌트에 이벤트 리스너를 등록
- 클래스로 인스턴스 생성후 addActionListener() 를 통해 버튼에 이벤트를 부착 jb.addActionListener(new MyactionListener());
- 이벤트 리스너 작성 방법 2 (바로 메서드 작성)
- addActionListener()를 통해 버튼에 이벤트 부착
- 인스턴스를 생성하는 동시에 익명 클래스로 메서드를 구현
12345jb.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e){..... 구현....});
어댑터 클래스
리스너 인터페이스를 상속받아 구현할 시 모든 인터페이스를 구현해야하는 부담이 생긴다.
이런 부담을 줄이기 위해 리스너 인터페이스 대신 어댑터 클래스를 상속받아 필요한 메서드만 구현
- 해당하는 Adapter 클래스를 상속받고 메서드를 정의
12345class Mymouse extends MouseAdapter{public void mouse(MouseEvent e) {....구현...}}
- addMouseListener 메서드를 통해 부착
Acation 이벤트
- action Event 메서드
getActionCommand() | 이벤트를 발생시킨 객체의 문자열 리턴 |
getSource() | 이벤트를 발생시킨 객체의 위치 값 리턴 |
getModifiers() | 이벤트가 발생되었을 때 같이 사용된 Modifier 키 리턴 |
Key 이벤트
key 이벤트는 사용자가 키를 입력할 때 발생하는 이벤트이며 모든 컴포넌트가 key이벤트를 받을 수 있다. 하지만 응용프로그램 내에 포커스를 가진 컴포넌트가 키 입력을 독점하기 때문에 현재 포커스를 가진 컴포넌트만 key 이벤트가 발생한다.
컴포넌트에게 포커스를 주어 키 입력 받게 해주는 메서드 1: compoenet.requestFocus()
* 해당 메서드는 프레임을 출력하고 컴포넌트에게 포커스를 주기 때문에setVisible(true) 실행 후에 실행돼야 함
컴포넌트에게 포커스를 주어 키 입력 받게 해주는 메서드 2: compoenet.setFoucsable(true)
- KeyListener 메서드
keyPressed(KeyEvent) | 키를 누르는 순간 |
keyTyped(KeyEvent) | 누른 키를 떼는 순간 (유니코드의 경우에만) |
keyReleased(KeyEvent) | 누른 키를 떼는 순간 |
- keyEvent 메서드
char KeyEvent.getKeyChar() | 입력된 키의 유니코드 값 반환 |
int KeyEvent.getKeyCode() | 정수형의 키 코드 값 반환 |
- KeyEvent 가상 키 (KeyEvent.Vk_?)
가상 키 | 설명 | 가상 키 | 설명 |
VK_0~VK~9 | 0~9 까지의 키 | VK_LEFT | 왼쪽 방향 키 |
VK_A~VK_Z | A~Z 까지의 키 | VK_RIGHT | 오른쪽 방향 키 |
VK_F1~VK_F24 | F1~F24 까지의 키 | VK_UP | <Up> 키 |
Mouse 이벤트
Mouse 이벤트는 총 7가지로 5가지는 MouseListener의 메서드가 호출되고 나머지 2가지는 MouseMotionListener의 메서드에서 호출된다. 각 메서드는 개별적이며 따로 등록해야 한다.
- MouseListener 메서드
MouseListener | 메서드 | 발생 경우 |
MouseListener |
mousePressed(MouseEvent) | 마우스 버튼이 눌러질 때 |
mouseReleased(MouseEvent) | 눌러진 마우스 버튼이 떼어질 때 | |
mouseClicked(MouseEvent) | 마우스 버튼이 클릴될 때 | |
mouseEntered(MouseEvent) | 마우스가 컴포넌트 위에 올라갈 때 | |
mouseExited(MouseEvent) | 컴포넌트 위에 올라간 마우스가 컴포넌트를 벗어날 때 | |
MouseMotionListener | mouseDragged(MouseEvent) | 마우스를 컴포넌트 위에서 드래그 할 때 |
mouseMoved(MouseEvent) | 마우스가 컴포넌트 위에서 움질일 때 |
mouseCilcked(): 한 컴포넌트에 마우스 버튼이 눌러졌다가 떼어졌을 때에만 호출
mouseReleased(): 모든 상황에서 마우스 버튼이 눌러졌다가 떼어졌을 때 호출
- MouseEvent 메서드
int getX() | 마우스 포인터의 x위치 |
int getY() | 마우스 포인터의 y위치 |
int getClickCount() | 마우스의 클릭 횟수 (주로 더블클릭 인식할 때 사용) |
getPoint() | 마우스 이벤트가 발생한 좌표 |
마우스로 컴포넌트 지정 시 포커스 지정 방법: Component c=(Coponent)event.getSource();
Item 이벤트
Item 이벤트는 체크박스나 라디오버튼이 선택되거나 해제될 때 발생하는 이벤트이다.
그러나 선택 상태가 바뀌지 않으면 이벤트는 발생하지 않는다.
- ItemListener 메서드
void itemStateChanged(ItemEvent e) | 체크박스의 선택상태가 변하는 경우 |
- ItemEvent 메서드
int getStateChange() | 체크박스 선택: ItemEvent.SELECTED/ 해제: ItemEvent.DESELECTED 리턴 |
Object getItem() | 이벤트 발생 객체 리턴, 체크박스의 경우 JCheckBox 컴포넌트의 레퍼런스 리턴 |
'JAVA > 기본 문법 내용 정리' 카테고리의 다른 글
다형성 (0) | 2022.12.29 |
---|---|
정규표현식 (0) | 2021.11.18 |
Swing 컴포넌트 (0) | 2021.11.03 |
자바 GUI 기초 (0) | 2021.10.29 |
컬렉션과 제네릭 (0) | 2021.10.29 |