기록하는 개발자

자바 #6 이벤트 처리 본문

JAVA

자바 #6 이벤트 처리

밍맹030 2020. 1. 5. 15:19
728x90

이벤트 처리

이벤트 기반 프로그래밍(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());

-이때, 리스너는 등록된 반대 순으로 모두 실행된다.(123 순으로 등록, 3 순으로 실행.)

 

이벤트 리스너 작성 방법

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) {

                      // 마우스 휠의 구르는 방향에 따라 이벤트를 처리한다.

           }

});

 

728x90

'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