자바의 이벤트 처리-1

mDev_97·2022년 1월 10일
0

Java

목록 보기
18/28

이벤트 기반 프로그래밍

• Event Driven Programming

이벤트 종류

사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 클릭 등
센서로부터의 입력
네트워크로부터의 데이터 송수신
다른 스레드 또는 다른 응용 프로그램부터의 메시지

프로그램의 흐름이 결정되는 방식

• 이벤트가 발생하면 이벤트를 처리하는 이벤트 리스너 실행
• 전적으로 이벤트 발생에 의해 어떤 코드를 언제 실행할 지를 결정

이벤트 처리 순서

1) 이벤트 발생
• 마우스 드래그, 마우스 클릭, 키보드 클릭 등

2) 이벤트 객체 생성
• 현재 발생한 이벤트에 대한 정보를 가진 객체

3) 이벤트 리스너 찾기
• 이벤트 리스너 : 이벤트를 처리하도록 만들어진 코드

4) 이벤트 리스너 호출
• 이벤트 객체가 리스너에 전달된다.

5) 이벤트 리스너 실행

이벤트 관련 용어

이벤트 소스

• 이벤트를 발생시킨 GUI 컴포넌트

이벤트 객체

• 발생한 이벤트에 대한 정보
• ex) 이벤트 종류, 이벤트 소스, 버튼 종류, 눌러진 키, 화면 좌표

이벤트 리스너

• 이벤트를 처리하는 코드
컴포넌트에 등록되어야 작동이 가능하다.

이벤트 분배 스레드

• 자바 가상 기계(JVM)로부터 이벤트 발생을 통지 받음
이벤트 소스와 이벤트 종료 결정
• 적절한 이벤트 객체 생성
• 이벤트 리스너를 호출
• 무한 루프를 실행하는 스레드

이벤트 객체

• 이벤트가 발생할 때, 발생한 이벤트에 대한 정보를 가진 객체
• 이벤트 리스너에 전달된다.

이벤트 객체가 포함하는 정보

• 이벤트 종류
• 이벤트 소스
• 이벤트가 발생한 화면내의 좌표
• 이벤트가 발생한 컴포넌트 내의 좌표
• 클릭된 마우스의 버튼 번호
• 마우스 클릭 횟수
• 키의 코드 값과 문자 값
• 버튼이나 메뉴 아이템의 문자열
• 체크박스, 라디오 버튼 등과 같은 컴포넌트의 체크 상태

ActionEvent 객체

• 액션 문자열

MouseEvent 객체

• 마우스의 위치 정보
• 마우스 버튼
• 함께 눌러진 키 정보 등

ItemEvent

• 아이템의 체크 상태

Object EventObject.getSource()

• 발생한 이벤트의 소스 컴포넌트를 리턴
• Object 타입으로 리턴
-> 캐스팅하여 사용한다.
• 모든 이벤트 객체에 대해 적용 가능

이벤트 리스너(Event Listener)

이벤트를 처리하는 코드
클래스로 작성한다.
• JDK에 이벤트 리스너 작성을 위한 인터페이스를 제공한다.
-> 추상 메소드를 구현하여 사용

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

예시

// MouseListener 인터페이스
interface MouseListener { // 아래 메소드를 모두 구현해야 한다.
    // 마우스 버튼이 눌러지는 순간 호출
    pulbic void mousePressed(MouseEvent e);
    
    // 눌러진 마우스 버튼이 떼어지는 순간 호출
    public void mouseReleased(MouseEvent e);
    
    // 마우스가 클릭되는 순간 호출
    public void mouseClicked(MouseEvent e);
    
    // 마우스가 컴포넌트 위에 올라가는 순간 호출
    public void mouseEntered(MouseEvent e);
    
    // 마우스가 컴포넌트에서 벗어나는 순간 호출
    public void mouseExited(MouseEvent e);
 }   
    

// ActionListener 인터페이스
interface ActionListener { // 아래 메소드를 구현해야 한다.
    // Action Event 발생 시 호출
    public void actionPerformed(ActionEvent e);
}

이벤트 리스너 작성 방법

1. 독립 클래스로 작성

• 이벤트 리스너를 완전한 클래스로 작성
• 이벤트 리스너를 여러 곳에서 사용하는 경우에 적합하다.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class EventListenerEx extends JFrame {
    public EventListenerEx() {
        super("독립 클래스로 Action Event 리스너 작성");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        JButton jBtn = new JButton("Java");
        // jBtn에 Action 리스너 적용
        jBtn.addActionListener(new IndepClassListener());
        contentPane.add(jBtn);
        
        setSize(300, 200);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new EventListenerEx();
    }
}

class IndepClassListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        // Object 객체로 리턴하므로 캐스팅이 필요
        JButton btn = (JButton)e.getSource();
        
        if(btn.getText().equals("Java")) {
            btn.setText("Python");
        } else {
            btn.setText("Java");
        }
    }
}

실행 결과

버튼 클릭 시

2. 내부 클래스(inner class)로 작성

• 클래스 안에 멤버와 같이 클래스를 작성
• 이벤트 리스너를 특정 클래스에서만 사용할 경우에 적합하다.
InnerClassListener의 멤버에 대한 접근이 용이

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class EventListenerEx extends JFrame {
    public EventListenerEx() {
        super("익명 클래스로 Action Event 리스너 작성");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        JButton jBtn = new JButton("Java");
        // jBtn에 Action 리스너 적용
        jBtn.addActionListener(new IndepClassListener());
        contentPane.add(jBtn);
        
        setSize(300, 200);
        setVisible(true);
    }
    
    private class IndepClassListener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        // Object 객체로 리턴하므로 캐스팅이 필요
        JButton btn = (JButton)e.getSource();
        
        if(btn.getText().equals("Java")) {
            btn.setText("Python");
        } else {
            btn.setText("Java");
        }
    }
}
    
    public static void main(String[] args) {
        new EventListenerEx();
    }
}

실행 결과

버튼 클릭 시

3. 익명 클래스(anonymous class)로 작성

• 클래스 이름없이 간단하게 리스너를 작성
• 리스너 코드가 간단한 경우에 적합하다.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class EventListenerEx extends JFrame {
    public EventListenerEx() {
        super("내부 클래스로 Action Event 리스너 작성");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        
        JButton jBtn = new JButton("Java");
        contentPane.add(jBtn);
        
        jBtn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JButton btn = (JButton)e.getSource();
                if(btn.getText().equals("Java")) {
                    btn.setText("Python");
                } else {
                    btn.setText("Java");
                }
            }
        });
        
        setSize(300, 200);
        setVisible(true);
    }
    
    public static void main(String[] args) {
        new EventListener();
    }
}

실행 결과

버튼 클릭 시

profile
안녕하세요. 백엔드, 클라우드, 인프라에 관심과 열정이 있는 김문성입니다. 😊

0개의 댓글

관련 채용 정보