Java
JAVA - 이벤트처리
해변
2022. 10. 11. 17:15
이벤트 기반 프로그래밍
이벤트의 발생에 의해. 프로그램 흐름이 결정되는 방식
- 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행
- 실행될 코드는 이벤트의 발생에 의해 전적으로 결정
반대되는 개념 : 배치 실행
- 프로그램 개발자가 프로그램의 흐름을 결정하는 방식
- 예시로 C언어 학생 정보 관리시스템이 있다
이벤트 종류
- 사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 누름
- 센서로부터의 입력, 네트워크로부터 데이터 송수신
- 다른 응용프로그램이나 다른 스레드로부터의 메세지
이벤트 처리 과정
- 이벤트 발생
- 예 : 마우스 클릭, 키보드 입력
- 이벤트 객체 생성
- 현재 발생한 이벤트에 대한 정보를 가진 객체
- 응용프로그램에 작성된 이벤트 리스너 찾기
- 이벤트 리스너 실행
- 리스너에 이벤트 객체 전달
- 리스너 코드 실행
이벤트 객체
발생한 이벤트에 관한 정보를 가진 객체이며 이벤트 리스너에 전달된다
이 과정으로 이벤트 리스너 코드가 발생한 이벤트에 대한 상황을 파악할 수 있게 한다
이벤트 객체가 포함하는 정보
- 이벤트 종류와 이벤트 소스
- 이벤트가 발생한 화면 좌표 및 컴포넌트 내 좌표
- 이벤트가 발생한 버튼이나 메뉴 아이템의 문자열
- 클릭된 마우스 버튼 번호 및 마우스의 클릭 횟수
- 키의 코드 값과 문자 값
- 체크박스, 라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크 상태
이벤트 소스를 알아 내는 메소드
- Object getSource()
- 발생한 이벤트의 소스 컴포넌트 리턴
- Object 타입으로 리턴하므로 캐스팅하여 사용
- 모든 이벤트 객체에 대해 적용
컴포넌트란?
여러 개의 프로그램 함수들을 모아 하나의 특정한 기능을 수행할 수 있도록 구성한 작은 기능적 단위
리스너 인터페이스
이벤트 리스너 : 이벤트를 처리하는 자바 프로그램 코드이며 클래스로 작성한다
자바에서는 다양한 리스너 인터페이스를 제공하는데 사용자는 이를 상속받아 구현한다
리스너 인터페이스의 모든 추상 메소드를 구현해야 한다
이벤트 리스너를 작성하는 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();
}
}