일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 컴퓨터비전
- build
- 파이썬
- 컨트리뷰톤
- 내휴학생활중의아주큰일
- Matrix Factorization
- BFS
- androidstudio
- 안드로이드스튜디오
- 대학원일기
- 휴학
- 대학원
- 프로그래머스
- git
- Python
- Github
- 다시풀기
- 어렵다
- SQL
- level3
- D3
- WebOS
- MSBuild
- level4
- level1
- SWEA
- 자바
- py
- LEVEL2
- java
- Today
- Total
bit가 눈 앞에서 왔다갔다
자바 이벤트 처리(1) 본문
1. 이벤트 기반 프로그래밍
: 이벤트 발생에 의해 프로그램 실행 흐름이 결정되는 방식의 프로그래밍 패러다임
이벤트: 키 입력, 클릭, 드래그, 데이터 수신 등등
이벤트 발생과 처리 과정:
사용자가 마우스로 버튼 클릭 -> 운영체제의 마우스 드라이버, 자바 가상 머신(JVM)에 전달
-> JVM은 이벤트 분배 스레드(핵심 요소, 무한루프 실행. 이벤트 발생 통지받아 소스, 종류 결정해서 적절한 이벤트 객체 생성 후 리스너 호출)에게 클릭 정보 전송
-> 이벤트 분배 스레드가 이벤트 객체 생성 (이벤트 발생시킨 GUI 컴포넌트: 이벤트 소스)
-> 이벤트 소스에 연결된 이벤트 리스너 호출 -> 이벤트 분배 스레드의 리턴
(이벤트는 순서대로 처리, 완전 종료 후 다음 이벤트 처리. 처리시간이 오래 걸리면 안 됨! 이벤트 리스너는 가능한 짧게 작성)
2. 이벤트 객체
:이벤트 관련 정보 담음, 이벤트 리스너에게 전달됨
1. java.util.EventObject 클래스 상속
2. java.awt.event / javax.swing.event 패키지 구현 -> 반드시 import
3. 이벤트 객체가 담는 정보(발생 이벤트에 따라 다름) : 이벤트 종류와 소스, 화면 또는 컴포넌트 내의 마우스 좌표, 클릭 횟수, 키 코드 값과 문자 값 등등
4. Object getSource() : 현재 발생한 이벤트 소스 컴포넌트의 레퍼런스 리턴. Object이므로 캐스팅해서 사용
ex) JButton b = (JButton)event.getSource();
5. 이벤트 객체와 소스(소스: ㅇㅇ을 상속받은 모든 스윙 컴포넌트에 대해 해당 이벤트 발생 가능)
3. 이벤트 리스너
:이벤트 처리 코드, 클래스로 만든다. 이벤트 리스너 인터페이스 제공, 클래스는 인터페이스 상속받고 추상메소드 구현. 컴포넌트에 등록 시 작동
(클래스는 인터페이스의 모든 추상메소드를 구현, 이벤트 발생 경우에 따라 어떤 메소드 호출되는지 숙지)
이벤트 리스너 작성 : 리스너 선택 -> 클래스 작성 -> 이벤트 받을 스윙 컴포넌트에 이벤트 리스너 등록
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, 인터페이스를 미리 구현해놓은 클래스!
추상메소드가 하나인 인터페이스는 어댑터가 없음
나 왜 계속 인터페이스를 인스턴스라 그러짘ㅋㅋㅋㅋ;;
'언어! > 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 |