Java

JAVA - 이벤트처리

해변 2022. 10. 11. 17:15

이벤트 기반 프로그래밍
이벤트의 발생에 의해. 프로그램 흐름이 결정되는 방식

  • 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행
  • 실행될 코드는 이벤트의 발생에 의해 전적으로 결정

반대되는 개념 : 배치 실행

  • 프로그램 개발자가 프로그램의 흐름을 결정하는 방식
  • 예시로 C언어 학생 정보 관리시스템이 있다

이벤트 종류
  • 사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 누름
  • 센서로부터의 입력, 네트워크로부터 데이터 송수신
  • 다른 응용프로그램이나 다른 스레드로부터의 메세지

이벤트 처리 과정
  1. 이벤트 발생
    • 예 : 마우스 클릭, 키보드 입력
  2. 이벤트 객체 생성
    • 현재 발생한 이벤트에 대한 정보를 가진 객체
  3. 응용프로그램에 작성된 이벤트 리스너 찾기
  4. 이벤트 리스너 실행
    • 리스너에 이벤트 객체 전달
    • 리스너 코드 실행

이벤트 객체

발생한 이벤트에 관한 정보를 가진 객체이며 이벤트 리스너에 전달된다
이 과정으로 이벤트 리스너 코드가 발생한 이벤트에 대한 상황을 파악할 수 있게 한다

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

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

이벤트 소스를 알아 내는 메소드

  • Object getSource() 
    • 발생한 이벤트의 소스 컴포넌트 리턴
    • Object 타입으로 리턴하므로 캐스팅하여 사용
    • 모든 이벤트 객체에 대해 적용

컴포넌트란?
여러 개의 프로그램 함수들을 모아 하나의 특정한 기능을 수행할 수 있도록 구성한 작은 기능적 단위

리스너 인터페이스

이벤트 리스너 : 이벤트를 처리하는 자바 프로그램 코드이며 클래스로 작성한다
자바에서는 다양한 리스너 인터페이스를 제공하는데 사용자는 이를 상속받아 구현한다
리스너 인터페이스의 모든 추상 메소드를 구현해야 한다

이벤트 리스너를 작성하는 3가지 방법

  1. 독립 클래스로 작성
    • 이벤트 리스너를 완전한 클래스로 작성
    • 이벤트 리스너를 여러 곳에서 사용할 때 적합
  2. 내부 클래스로 작성 
    • 클래스 안에 멤버처럼 클래스 작성
    • 이벤트 리스너를 특정 클래스에서만 사용할 때 적합
  3. 익명 클래스로 작성
    • 클래스의 이름 없이 간단히 리스너 작성
    • 클래스 조차 만들 필요 없이 리스너 코드가 간단한 경우에 적합


아래의 간단한 예시로 알아보자

//독립 클래스로 Action 이벤트 리스너 만들기
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class IndepClassListener extends JFrame{ //JFrame 상속
    public IndepClassListener(){ //생성자
        setTitle("Action 이벤트 리스너 예제"); //타이틀
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프로그램 종료시 프로세스 종료
        Container c = getContentPane(); //컨탠트팬 알아내기
        c.setLayout(new FlowLayout()); //FlowLayout 배치관리자 설정
        JButton btn = new JButton("Action"); //Action 버튼 생성
        btn.addActionListener(new MyActionListener()); //Action 이벤트 리스너 등록
        c.add(btn); 
        setSize(250, 120);
        setVisible(true);
    }

    public static void main(String[] args) {
       // new IndepClassListener(); 
    }
}


class MyActionListener implements ActionListener { //Action 이벤트 리스너 구현
    public void actionPerformed(ActionEvent e){
        JButton b = (JButton)e.getSource(); //이벤트 실행시 모든 속성을 가져옴
        if((b.getText()).equals("Action")) b.setText("액션");
        //b텍스트가 Action일 경우 액션으로 바꾸기
        else b.setText("Action");
        //그 외의 경우 Action으로 바꾸기

    }
}

클릭을 하면 액션->Action, Action->액션으로 바뀌는 것을 알 수 있다.

더보기
//내부 클래스로 Action 이벤트 리스너 만들기
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

 

public class InnerClassListener extends JFrame{ //JFrame 상속
public InnerClassListener(){ //생성자
setTitle("Action 이벤트 리스너 예제"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프로그램 종료시 프로세스 종료
Container c = getContentPane(); //컨탠트팬 알아내기
c.setLayout(new FlowLayout()); //FlowLayout 배치관리자 설정
JButton btn = new JButton("Action"); //Action 버튼 생성
btn.addActionListener(new MyActionListener()); //Action 이벤트 리스너 등록
c.add(btn);
setSize(250, 120);
setVisible(true);
}
 
private class MyActionListener implements ActionListener { //Action 이벤트 리스너 구현
public void actionPerformed(ActionEvent e){
JButton b = (JButton)e.getSource(); //이벤트 실행시 모든 속성을 가져옴
if((b.getText()).equals("Action")) b.setText("액션");
//b텍스트가 Action일 경우 액션으로 바꾸기
else b.setText("Action");
//그 외의 경우 Action으로 바꾸기
InnerClassListener.this.setTitle(b.getText()); //타이틀에 버튼 문자열 출력
}
}
public static void main(String[] args) {
new InnerClassListener();
}
}




왜인지 모르겠는데 코드블럭으로 코드쓰면 먹통된다;
초기화 제발 적당히

더보기
//익명 클래스로 Action 이벤트 리스너 만들기
import javax.swing.JFrame;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

 

public class AnonymousClassListener extends JFrame{
public AnonymousClassListener() {
setTitle("Action 이벤트 리스너 작성");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
c.add(btn);

 

btn.addActionListener(new ActionListener() { //익명 클래스로 Action 리스너 작성
public void actionPerformed(ActionEvent e){
JButton b = (JButton)e.getSource();
if(b.getText().equals("Action")) b.setText("액션");
else {
b.setText("Action");
setTitle(b.getText()); //AnonymousClassListener의 멤버나 JFrame 멤버 호출 가능
}
}
});
setSize(350, 150);
setVisible(true);
}
public static void main(String[] args) {
new AnonymousClassListener();
}
}