• Event Driven Programming
• 사용자의 입력 : 마우스 드래그, 마우스 클릭, 키보드 클릭 등
• 센서로부터의 입력
• 네트워크로부터의 데이터 송수신
• 다른 스레드 또는 다른 응용 프로그램부터의 메시지
• 이벤트가 발생하면 이벤트를 처리하는 이벤트 리스너 실행
• 전적으로 이벤트 발생에 의해 어떤 코드를 언제 실행할 지를 결정
1) 이벤트 발생
• 마우스 드래그, 마우스 클릭, 키보드 클릭 등
2) 이벤트 객체 생성
• 현재 발생한 이벤트에 대한 정보를 가진 객체
3) 이벤트 리스너 찾기
• 이벤트 리스너 : 이벤트를 처리하도록 만들어진 코드
4) 이벤트 리스너 호출
• 이벤트 객체가 리스너에 전달된다.
5) 이벤트 리스너 실행
• 이벤트를 발생시킨 GUI 컴포넌트
• 발생한 이벤트에 대한 정보
• ex) 이벤트 종류, 이벤트 소스, 버튼 종류, 눌러진 키, 화면 좌표
• 이벤트를 처리하는 코드
• 컴포넌트에 등록되어야 작동이 가능하다.
• 자바 가상 기계(JVM)로부터 이벤트 발생을 통지 받음
• 이벤트 소스와 이벤트 종료 결정
• 적절한 이벤트 객체 생성
• 이벤트 리스너를 호출
• 무한 루프를 실행하는 스레드
• 이벤트가 발생할 때, 발생한 이벤트에 대한 정보를 가진 객체
• 이벤트 리스너에 전달된다.
• 이벤트 종류
• 이벤트 소스
• 이벤트가 발생한 화면내의 좌표
• 이벤트가 발생한 컴포넌트 내의 좌표
• 클릭된 마우스의 버튼 번호
• 마우스 클릭 횟수
• 키의 코드 값과 문자 값
• 버튼이나 메뉴 아이템의 문자열
• 체크박스, 라디오 버튼 등과 같은 컴포넌트의 체크 상태
• 액션 문자열
• 마우스의 위치 정보
• 마우스 버튼
• 함께 눌러진 키 정보 등
• 아이템의 체크 상태
• 발생한 이벤트의 소스 컴포넌트를 리턴
• Object 타입으로 리턴
-> 캐스팅하여 사용한다.
• 모든 이벤트 객체에 대해 적용 가능
• 이벤트를 처리하는 코드
• 클래스로 작성한다.
• 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);
}
• 이벤트 리스너를 완전한 클래스로 작성
• 이벤트 리스너를 여러 곳에서 사용하는 경우에 적합하다.
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");
}
}
}
• 실행 결과
버튼 클릭 시
• 클래스 안에 멤버와 같이 클래스를 작성
• 이벤트 리스너를 특정 클래스에서만 사용할 경우에 적합하다.
•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();
}
}
• 실행 결과
버튼 클릭 시
• 클래스 이름없이 간단하게 리스너를 작성
• 리스너 코드가 간단한 경우에 적합하다.
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();
}
}
• 실행 결과
버튼 클릭 시