일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 코딩테스트 고득점 Kit
- vanillaJS
- JavaScript
- 데이터모델링과마이닝
- 장고
- react hook
- 자바 공부
- react
- NextJS
- Java
- 디자인 패턴
- 백준
- design pattern
- 자바
- codesandbox
- useEffect
- 프로그래머스 완전탐색
- react firebase
- 코딩테스트 고득점 Kit 완전탐색
- websocket
- 프로그래머스 자바
- 리액트 훅
- 자바스크립트
- 프로그래머스
- 프로그래밍 언어론
- React JS
- 컴퓨터 네트워크
- useState
- 코틀린
- 리액트
- Today
- Total
기록하는 개발자
자바 #6 이벤트 처리 본문
이벤트 처리
이벤트 기반 프로그래밍(Event Driven Programming)
-종류 : 마우스(드래그, 클릭), 키보드 누름 / 센서로부터의 입력 / 네트워크로부터 데이터 송수신
이벤트의 발생에 의해 프로그램 흐름이 결정되는 방식
-이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행
-프로그램 내의 어떤 코드가 언제 실행될 지 이벤트 발생에 의해 전적으로 결정
반대되는 개념 : 배치 실행(batch programming)
-프로그램의 개발자가 프로그램의 흐름을 결정하는 방식
이벤트 처리 순서
-이벤트 발생(예 :마우스나 키보드의 움직임 혹은 입력)
-이벤트 객체 생성 →현재 발생한 이벤트에 대한 정보를 가진 객체
-이벤트 리스너 찾기
-이벤트 리스너 호출
-이벤트 객체가 리스너에 전달됨
-이벤트 리스너 실행
이벤트 관련 용어
-이벤트 소스 : 이벤트를 발생시킨 GUI 컴포넌트
-이벤트 객체 : 발생한 이벤트에 대한 정보
예) 이벤트 종류, 이벤트 소스, 화면 좌표, 마우스 버튼 종류, 눌러진 키
-이벤트 리스너 : 이벤트를 마지막으로 처리하는 코드로 컴포넌트에 등록되어야 작동 가능
-이벤트 분배 스레드 :
- 동작 : 자바 가상 기계로부터 이벤트의 발생 정보를 받아와 이벤트 소스와 이벤트 종류를 결정하고, 적절한 이벤트 객체 생성한다. 그 후에 이벤트 리스너를 찾아 호출
-무한 루프를 실행하는 스레드 : Frame 의 x버튼이 눌려질 때까지 이를 반복하며
x버튼이 눌리면 종료
이벤트 객체
-이벤트 발생 시에 해당 이벤트에 관한 정보를 가진 객체
-이벤트 리스너에게 이 정보가 전달된다.(이벤트 리스너 코드에서 이벤트 발생 상황을 파악할 수 있게 한다.)
-이벤트 분배 스레드가 이벤트 객체를 생성한다.
1.이벤트 객체가 포함하는 정보
-이벤트 종류
-이벤트 소스
-이벤트가 발생한 화면 좌표
-이벤트가 발생한 컴포넌트 내 좌표
-마우스의 클릭 횟수
-클릭된 마우스 버튼 번호
-버튼이나 메뉴에서 클릭이 발생됐을 때 그 버튼이나 메뉴 아이템의 문자열
-체크박스와 라디오 버튼 등과 같은 컴포넌트에서 발생한 이벤트라면 체크 상태
-키가 눌러졌다면 키의 코드 값과 문자 값
2. 이벤트에 따라 약간 다른 정보 포함
-ActionEvent 객체 : 액션 문자열
-MouseEvent 객체 : 마우스의 위치 정보, 마우스 버튼, 함께 눌러진 키 정보 등
-ItemEvent 객체 : 아이템의 체크 상태(체크박스와 라디오버튼 관여)
3. 이벤트 소스 알아 내기
Object EventObject.getSource()
-발생한 이벤트의 소스 컴포넌트 리턴
-Object 타입으로 리턴하므로 캐스팅하여 사용
-모든 이벤트 객체에 대해 적용
-textfield에 입력하는 동안 keyevent가 발생하고 enter key 를 치면 action event 발생
-체크 박스에 관한 모든 이벤트는 itemevent 가 처리.
이벤트 리스너
-실제로 이벤트를 처리하는 코드. 클래스로 작성한다.
-모든 메소드는 클래스 내에 구현
-jdk에서 리스너 작성을 위한 인터페이스를 제공한다.
→개발자가 인터페이스를 상속 받아 추상 메소드를 구현하면 된다.
-마우스 이벤트 처리를 위해 마우스 리스너를 구현 할 때는 리스너의 추상 메소드 5개를 모두 구현 해야 한다. 만약 딱히 하는 일이 없는 메소드가 있다면 empty body로 내부 구현을 안하면 된다.
Ex) class MyActionListener implements ActionListener{}
-리스너마다 클래스 만들어 줘야함
-버튼 마다 add로 리스너 추가해주어야함.
Class A implements ActionListener{
public void actionPerformed(){//event가 발생하면 어떻게 처리해야할 지 재정의 해야함
…
}
JButton jb=new JButton;
jb.addActionListener(new A()); /버튼에 add로 리스너 추가
}
-컴포넌트는 다른 이벤트에 대한 리스너를 동시에 가질 수 있다.
Ex)
JButton.addActionListener(); // Action 리스너
JButton.addKeyListener(); // Key 리스너
JButton.addFocusListener(); // Focus 리스너
-컴포넌트는 한 이벤트에 대해 여러 개의 리스너를 동시에 가질 수 있다.
-하나하나 리스너 add 해줘야함
JButton.addActionListener(new MyButtonListener1()); JButton.addActionListener(new MyButtonListener2()); JButton.addActionListener(new MyButtonListener3()); -이때, 리스너는 등록된 반대 순으로 모두 실행된다.(1→2→3 순으로 등록, 3→2à→ 순으로 실행.) |
이벤트 리스너 작성 방법
1. 독립 클래스로 작성
-이벤트 리스너를 완전한 클래스로 작성한다.
-이벤트 리스너 한 개를 여러 곳에서 사용할 때 적합하다.
2. 내부 클래스로 작성
-클래스 안에 멤버처럼 클래스를 작성한다.
-특정 클래스에서만 사용할 때 적합하다.
3. 익명 클래스로 작성
-클래스의 이름 없이 간단히 리스너를 작성한다.
-클래스 조차 만들 필요 없이 리스너 코드가 간단한 경우에 적합하다.
어댑터 클래스
-리스너 작성 시에 사용하지 않는 추상 메소드를 empty body로 라도 모두 구현해야 하는 부담
-어댑터 클래스 : 리스너의 모든 메소드가 단순 return 하도록 구현해 놓은 클래스
-추상 메소드가 하나 뿐인 리스너는 어댑터 클래스가 없다. Ex) actionlistener, itemlistener
-KeyAdapter, MouseAdapter 등이 있다.
Key 이벤트와 포커스
키를 누르는 순간, 누른 키를 떼는 순간, 누른 키를 떼는 순간(Unicode 키의 경우에만)
→키 입력 시에 위 세 가지 경우 key 이벤트 발생
키 이벤트를 받을 수 있는 조건 : 모든 컴포넌트가 가능하지만 현재 포커스를 가진 컴포넌트
포커스
-컴포넌트나 응용 프로그램이 키 이벤트를 독점하는 권한
-컴포넌트에 포커스 설정 방법 : 아래 두 줄의 코드 필요
component.setFocusable(true); // component가 포커스를 받을 수 있도록 설정
component.requestFocus(); // componen에 포커스 강제 지정
컴포넌트에 포커스 주기
1.스윙 프레임이 만들어질 포커스를 주고자 하는 경우
-JFrame의 setVisible(true) 이후에 포커스를 주어야함
setVisible(true); // 스윙 프레임 출력 component.setFocusable(true); component.requestFocus(); |
2.마우스로 컴포넌트를 클릭할 때 포커스 지정하는 방법
-언제든지 필요할 때 포커스 줄 수 있음.
component.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { Component c = (Component)e.getSource(); // 클릭된 컴포넌트 c.setFocusable(true); c.requestFocus(); } }); |
KeyListener 의 메소드와 키
1.메소드 3개
-키를 누르는 순간
void keyPressed(KeyEvent e) {
// 이벤트 처리 루틴
}
-키를 떼는 순간
void keyReleased(KeyEvent e) {
// 이벤트 처리 루틴
}
-누른 키를 떼는 순간 unicode가 입력된 경우
void keyTyped(KeyEvent e) {
// 이벤트 처리 루틴
}
Keylistener의 실행순서 : keyPressed → keyRealease
2.컴포넌트의 키 이벤트 리스너 등록
-component.addKeyListener(mykeylistener);
3.키 종류
-(1)유니코드키
-전 세계 문자에 대한 코드 체계로 문자들에 대해서만 유니코드 값 정의
Ex) A~Z, a~z, 0~9, !, @, &
-유니코드 키가 눌러진 경우 이벤트 호출 순서: keyPressed() → keyTyped() → keyReleased()
-(2)유니코드가 아닌 키
-문자 키가 아닌 다음 키들(제어 키)
Ex) <Function>, <Home>, <Up>, <Delete>, <Control>, <Shift>, <Alt> 등
-정의된 유니코드 값이 없으며 키마다 키 코드 값(가상 키 코드 값)이 정의 되어있음
-유니코드 키가 아닌 경우 키 이벤트 호출 순서 : keyPressed(), keyReleased()
-(3)가상키
-유니코드 키든 아니든 모든 키에 자바의 가상 키 코드가 정의되어 있음
-가상 키 값으로 어떤 키인지 비교 판단이 가능하다.
-가상 키 코드는 KeyEvent 클래스에 상수로 선언
4.입력된 키 판별
-키가 입력되면 키 정보를 가진 이벤트 객체 생성 : KeyEvent 객체
→KeyEvent 객체가 리스너에게 전달된다.
-(1)키의 문자 코드(유니코드) 알아내기, char KeyEvent.getKeyChar()
-눌러진 키에 해당하는 문자 코드(유니코드) 리턴
-눌러진 키가 문자 키인 경우에만 작동
-(2)입력된 키의 가상 키 값 알아내기, int KeyEvent.getKeyCode()
-모든 키에 대해 작동
-입력된 키를 판별하기 위해 가상키(Virtual Key) 값과 비교
-가상 키 값은 KeyEvent 클래스의 상수로 정의됨
-(3)키 이름 문자열 리턴 String KeyEvent.getKeyText(int keyCode)
-Static 메소드
-매개변수 keyCode의 코드 값(가상 키)에 해당하는 키의 이름 문자열 리턴
-F1 키의 경우 "F1", Shift 키의 경우 "SHIFT" 등의 문자열 리턴
마우스 이벤트와 마우스 관련 리스너
1.마우스 이벤트
사용자의 마우스 조작에 따라 발생하는 이벤트, 8가지 경우
-마우스가 눌러진 위치에서 떼어지는 경우 메소드 호출 순서
mousePressed() → mouseReleased() → mouseClicked() => 누르기->떼기->클릭 처리
-마우스가 드래그 될 때 호출되는 메소드 호출 순서
mousePressed()→mouseDragged() → mouseDragged(),..., mouseDragged() → mouseReleased()
2.마우스 리스너 달기
MouseListener의 5 개의 이벤트를 처리하는 경우
→mouseEntered(), mouseExited(), mousePressed(), mouseReleased(), mouseClicked()
-마우스 리스너 등록
component.addMouseListener(myMouseListener);
-MouseMotionListener의 이벤트도 함께 처리하고자 하는 경우
mouseDragged(), mouseMoved()
→마우스 모션 리스너 등록 필요
component.addMouseMotionListener(myMouseMotionListener);
3.MouseEvent 객체로부터 얻을 수 있는 정보
-마우스 포인터 위치
int getX(), int getY(),
Point getPoint()
-입력된 마우스 버튼 : int getButton()
-마우스 클릭 횟수 : int getClickCount()
4.MouseWheelEvent와 MouseWheelListener
-마우스 휠 이벤트 : 마우스 휠이 구를 때마다 발생하는 이벤트
→이벤트 발생 시 마다 MouseWheelEvent 객체 생성
-MouseWheelListener : 마우스 휠 이벤트 리스너로 해당 이벤트가 발생할 때마다 호출된다.
→public void mouseWheelMoved(MouseWheelEvent e)
-마우스 휠 리스너 구현
component.addMouseWheelListener(new MouseWheelListener() { public void mouseWheelMoved(MouseWheelEvent e) { // 마우스 휠의 구르는 방향에 따라 이벤트를 처리한다. } }); |
'JAVA' 카테고리의 다른 글
[Java] StringBuffer와 StringBuilder (0) | 2021.07.28 |
---|---|
자바 #7 기본적인 스윙 컴포넌트와 활용 (0) | 2020.01.05 |
자바 #5 JAVA GUI (0) | 2020.01.05 |
자바 #4 컬렉션 (0) | 2020.01.05 |
자바 #3 모듈과 패키지 (0) | 2020.01.04 |