bit가 눈 앞에서 왔다갔다

자바 이벤트 처리(1) 본문

언어!/Java

자바 이벤트 처리(1)

헬린인형 2021. 5. 8. 17:38

1. 이벤트 기반 프로그래밍

: 이벤트 발생에 의해 프로그램 실행 흐름이 결정되는 방식의 프로그래밍 패러다임

이벤트: 키 입력, 클릭, 드래그, 데이터 수신 등등

이벤트 발생과 처리 과정:

사용자가 마우스로 버튼 클릭 -> 운영체제의 마우스 드라이버, 자바 가상 머신(JVM)에 전달

-> JVM은 이벤트 분배 스레드(핵심 요소, 무한루프 실행. 이벤트 발생 통지받아 소스, 종류 결정해서 적절한 이벤트 객체 생성 후 리스너 호출)에게 클릭 정보 전송

-> 이벤트 분배 스레드가 이벤트 객체 생성 (이벤트 발생시킨 GUI 컴포넌트: 이벤트 소스)

-> 이벤트 소스에 연결된 이벤트 리스너 호출 -> 이벤트 분배 스레드의 리턴

(이벤트는 순서대로 처리, 완전 종료 후 다음 이벤트 처리. 처리시간이 오래 걸리면 안 됨! 이벤트 리스너는 가능한 짧게 작성)

 

2. 이벤트 객체

:이벤트 관련 정보 담음, 이벤트 리스너에게 전달됨

1. java.util.EventObject 클래스 상속

2. java.awt.event / javax.swing.event 패키지 구현 -> 반드시 import

3. 이벤트 객체가 담는 정보(발생 이벤트에 따라 다름) : 이벤트 종류와 소스, 화면 또는 컴포넌트 내의 마우스 좌표, 클릭 횟수, 키 코드 값과 문자 값 등등

출처: 생능출판, 명품 자바프로그래밍, 541쪽

4. Object getSource() : 현재 발생한 이벤트 소스 컴포넌트의 레퍼런스 리턴. Object이므로 캐스팅해서 사용

ex) JButton b = (JButton)event.getSource();

5. 이벤트 객체와 소스(소스: ㅇㅇ을 상속받은 모든 스윙 컴포넌트에 대해 해당 이벤트 발생 가능)

출처 동일 542쪽

 

3. 이벤트 리스너

:이벤트 처리 코드, 클래스로 만든다. 이벤트 리스너 인터페이스 제공, 클래스는 인터페이스 상속받고 추상메소드 구현. 컴포넌트에 등록 시 작동

(클래스는 인터페이스의 모든 추상메소드를 구현, 이벤트 발생 경우에 따라 어떤 메소드 호출되는지 숙지)

출처 동일, 544쪽

이벤트 리스너 작성 : 리스너 선택 -> 클래스 작성 -> 이벤트 받을 스윙 컴포넌트에 이벤트 리스너 등록

class MyActionListener implements ActionListener {	//리스너 인터페이스 상속
	public void actionPerformed(ActionEvent e) {	//리스너 추상 메소드, 이벤트 객체가 인자로
		JButton b = (JButton)e.getSource(); 		//이벤트 소스 알아냄 -> 클릭된 버튼 알아내기
		//if(b.getText().equals("안녕"))
		if(e.getActionCommand().equals("안녕"))	
		//getSource(): 이벤트 소스 알아냄, 객체 위치값 getActionCommand(): 이벤트 발생시킨 객체의 문자열
			b.setText("hi");			//문자열 바꿈
		else
			b.setText("안녕");	
	}
}

이벤트 리스너 등록 : ex) component.add이벤트이름Listener(listener);

어떤 컴포넌트에 대해, 발생하지 않는 이벤트들은 관련 메소드가 없음

add -> 컴포넌트가 동일한 이벤트에 대해 여러 개의 이벤트 리스너 사용 가능! 등록된 반대 순서로 실행

MyActionListener listener = new MyActionListener();
		btn.addActionListener(listener);			//등록

 

*이벤트 리스너 작성 방법

1. 독립된 클래스로 작성

package chapter10;

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

//indepClassListener
public class StudyEvent extends JFrame {
	public StudyEvent() {
		setTitle("이벤트 리스너 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
	
		JButton btn = new JButton("안녕");
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		
		setSize(350,140);
		setVisible(true);
	}
	public static void main(String [] args) {
		new StudyEvent();
		
	}
}

class MyActionListener implements ActionListener {	//리스너 인터페이스 상속
	public void actionPerformed(ActionEvent e) {	//리스너 추상 메소드, 이벤트 객체가 인자로
		JButton b = (JButton)e.getSource(); 		//이벤트 소스 알아냄 -> 클릭된 버튼 알아내기
		if(e.getActionCommand().equals("안녕"))
			b.setText("hi");			//문자열 바꿈
		else
			b.setText("안녕");
	}
}

//리스너가 길 경우 유리. 프레임윈도우(제목 표시줄 갖는 윈도우. StudyEvent 클래스) 멤버 접근 불가

 

2. 내부 클래스로 작성

package chapter10;

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

public class StudyEvent extends JFrame {
	public StudyEvent() {
		setTitle("이벤트 리스너 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
	
		JButton btn = new JButton("안녕");
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		
		setSize(350,140);
		setVisible(true);
	}
	
	//innerClassListener
	private class MyActionListener implements ActionListener {	//리스너 인터페이스 상속
		public void actionPerformed(ActionEvent e) {	//리스너 추상 메소드, 이벤트 객체가 인자로
			JButton b = (JButton)e.getSource(); 		//이벤트 소스 알아냄 -> 클릭된 버튼 알아내기
			if(e.getActionCommand().equals("안녕"))
				b.setText("hi");			//문자열 바꿈
			else
				b.setText("안녕");
			//StudyEvent.this.setTitle(b.getText());		//title도 같이 바뀜
			setTitle(b.getText());
		}
	}
	
	public static void main(String [] args) {
		new StudyEvent();
	}
}

//외부클래스 StudyEvent, JFrame 멤버 접근 가능

 

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

package chapter10;

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

public class StudyEvent extends JFrame {
	public StudyEvent() {
		setTitle("이벤트 리스너 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
	
		JButton btn = new JButton("안녕");
		
		//AnonymousClass Listener
		btn.addActionListener(new ActionListener() {		
									//상속 받고 바로 메소드, 동시에 new로 바로 인스턴스 생성
			public void actionPerformed(ActionEvent e) {	
				JButton b = (JButton)e.getSource(); 		
				if(e.getActionCommand().equals("안녕"))
					b.setText("hi");			
				else
					b.setText("안녕");
				//StudyEvent.this.setTitle(b.getText());	//title도 같이 바뀜
				setTitle(b.getText());
			}
		});
		c.add(btn);
		
		setSize(350,140);
		setVisible(true);
	}
	public static void main(String [] args) {
		new StudyEvent();
	}
}

//편리! 내부 클래스, 외부 클래스 멤버 접근 가능

안드로이드 하면 익명 클래스 모양으로 많이 코딩하던데 뭔가 했는데 이번에 확실히 알게됨..! 이런 보람에 공부합니당,,

 

4. 어댑터 클래스

쓰지 않는 추상메소드까지 다 작성해야 하는 부담을 없애줌.

클래스이므로 extends, 인터페이스를 미리 구현해놓은 클래스!

추상메소드가 하나인 인터페이스는 어댑터가 없음

554쪽

 

나 왜 계속 인터페이스를 인스턴스라 그러짘ㅋㅋㅋㅋ;;

반응형

'언어! > Java' 카테고리의 다른 글

자바 이벤트 처리(2)_Key Event, Mouse Event  (1) 2021.05.09
GUI 기초_컨테이너, 배치  (0) 2021.05.02
GUI 기초_AWT, Swing  (0) 2021.04.30
JAVA 복습 목표!  (0) 2021.04.30
Comments