728x90
반응형
📌 이벤트 처리
📚 이벤트 기반 프로그래밍
이벤트 발생에 의해 프로그램 흐름이 결정되는 방식의 프로그램 패러다임입니다.
📃 이벤트
- 윈도우 프로그래밍에서 어떤 특정 행동이 발생한 그 자체를 의미
- 사용자의 입력 : 마우스/키보드 조작
- 네트워크로부터 데이터 송수신
- 다른 응용 프로그램/스레드로부터의 메시지
📃 이벤트 기반 프로그래밍(Event Driven Programming)
- 이벤트 중심 프로그래밍
- 어떤 사건에 따라 제어 흐름이 결정되어 동작을 처리
📚 JAVA에서 이벤트 처리 구조
각 이벤트 소스마다 이벤트 리스너와 연결하여 이벤트를 처리합니다.
📃 이벤트 소스(Event Souce) 객체
- 이벤트를 발생시킨 컴포넌트 객체
- 사용자로부터 입력을 기다리는 객체 ex) 버튼, 입출력
📃 이벤트 리스너(Event Listener) 객체
- 이벤트 소스에서 발생한 이벤트를 처리하는 객체
- 이벤트 발생시, 연관된 이벤트 리스너는 이벤트 핸들러 메서드를 자도으로 호출하여 이벤트 전달
📃 이벤트 핸들러(Event Handler) 메서드
- 전달된 이벤트를 처리하는 메서드
- 발생된 이벤트에 따라 지정된 동작 수행
📚 JAVA에서 이벤트 처리 과정
1. 이벤트 소스에서 이벤트 발생
- 사용자의 조작 혹은 프로그램 자체적으로
- 개발자가 처리할 필요 X
2. 이벤트 객체 생성
- 현재 발생한 이벤트에 대한 정보를 가진 객체
- 개발자가 처리할 필요 X
3. 이벤트 소스에 연관된 리스너에 이벤트 객체 전달
4. 이벤트 리스너의 이벤트 핸들러 메서드 실행
- 개발자는 이벤트 핸들러 메서드만 처리하면 됨
- 이벤트 핸들러 메서드에 이벤트 객체 전달
- 이벤트 핸들러 코드 실행
📌 이벤트 처리 방법
📚 이벤트 처리를 위한 프로그래밍
1단계: 이벤트 소스 결정
- 이벤트를 발생시킬 컴포넌트 결정
- 컴포넌트에서 여러 개의 이벤트 중 관심 있는 이벤트를 골라 이벤트 발생될 종류를 결정
2단계: 이벤트 리스너 구현
- 이벤트를 처리할 객체의 클래스를 이벤트 리스너 인터페이스로 구현
- 인터페이스의 추상 메서드를 오버라이딩
- 관심있는 메서드만 따로 고라 재정의하는 것
- 이벤트 발생시 수행할 동작을 기술
3단계: 이벤트 소스와 이벤트 리스너 연결
- addXXXListener() 메서드를 통해 컴포넌트에 이벤트 리스너를 연결
- 이벤트 발생시 이를 감지해 처리할 수 있도록
📚 이벤트 처리
- 리스너 객체 생성하는 방법은 여러가지
- 이벤트를 처리하는 다양한 방법 제공
- 각 방법마다 효율성/가독성의 차이가 있으므로 적절한 방법 선택 필요
addXXXListener()의 인수인 리스너를 생성하는 방법은 다음과 같습니다.
- 현재 클래스 사용
- 일반 클래스 사용
- 내부 클래스 ㅅ용
- 익명 내부 클래스 사용
- 익명 내부 클래스 임시 객체 사용
📚 방법1: 현재 클래스 사용
리스너 인터페이스를 구현하는 일반 클래스를 작성하고 추상 메서드를 구현
■ 장점
- 이벤트 리스너를 여러 클래스에서 사용할 때 적합
■ 단점
- 리스너 구현을 위해 별도의 클래스 선언 필요
- 필요시,생성자에서 컴포넌트 객체에 대한 참조를 전달받아야 해당 컴포넌트에 접근 가능
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx implements ActionListener{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame = new JFrame("HelloEx");
buildGUI(); // GUI 설정하는 메서드를 따로 나눔
frame.setBounds(500,500,100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text = new JTextField();
JButton button= new JButton("확인");
button.addActionListener(this);
label = new JLabel("Hello World");
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
@Override
// 버튼을 눌렀을 때 발생하는 이벤트 처리 메서드
public void actionPerformed(ActionEvent e) {
String name = text.getText();
label.setText("Hello, "+name);
text.setText("");
}
// main에서는 GUI 객체를 만드는 일만 할 것
public static void main(String[] args) {
new HelloEx();
}
}
📚 방법2: 일반 클래스 사용
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx {
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame = new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,500,100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler(text, label));
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new HelloEx();
}
}
// 이벤트를 처리하는 별도의 클래스ㅡㄹㄹ 작성한 것
class ActionEventHandler implements ActionListener{
private JTextField text;
private JLabel label;
ActionEventHandler(JTextField text, JLabel label){
this.text=text;
this.label=label;
}
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
📚 방법3: 내부 클래스(Inner class) 사용
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,500,100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
// 애부에 클래스를 만들어서 사용
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
});
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
public static void main(String[] args) {
new HelloEx();
}
}
📚 방법4: 익명 내부 클래스 사용
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,500,100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler());
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
// 내부에 클래스를 정의하여 처리
class ActionEventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
public static void main(String[] args) {
new HelloEx();
}
}
📚 방법5: 익명 내부 클래스 임시 객체 사용
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class HelloEx{
private JFrame frame;
private JTextField text;
private JLabel label;
public HelloEx() {
frame=new JFrame("HelloEx");
buildGUI();
frame.setBounds(500,500,100,100);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
private void buildGUI() {
text=new JTextField();
label=new JLabel("Hello World");
JButton button=new JButton("확인");
button.addActionListener(new ActionEventHandler());
frame.add(text, BorderLayout.CENTER);
frame.add(button, BorderLayout.EAST);
frame.add(label, BorderLayout.SOUTH);
}
class ActionEventHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
String name=text.getText();
label.setText("Hello, "+name);
text.setText("");
}
}
public static void main(String[] args) {
new HelloEx();
}
}
반응형
'코딩언어 > JAVA' 카테고리의 다른 글
[JAVA] 14-2 Swing의 기본 구성 (0) | 2022.11.09 |
---|---|
[JAVA] 14-1 Swing의 기본 특징 (0) | 2022.11.08 |
[JAVA] 13. 제네릭과 컬렉션 (0) | 2022.11.05 |
[JAVA] 12. 예외처리 (0) | 2022.11.04 |
[JAVA] 11 추상 클래스와 인터페이스 (0) | 2022.11.03 |