-
[JAVA]자바의 이벤트 처리/이벤트 개념/이벤트 리스너/작성 방법/ 독립 클래스/내부 클래스/익명 클래스Languages/Java 2021. 4. 24. 20:22반응형
이벤트 기반 프로그래밍
이벤트 종류
사용자의 입력 : 마우스 드래그,마우스 클릭,키보드 누림 등
센서로부터의 입력, 네트워크로부터 데이타 송수신
다른 응용 프로그램이나 다른 스레드로부터의 메시지
이벤트의 발생에 의해 프로그램 흐름이 결정되는 방식
이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너) 실행
프로그램 내의 어떤 코드가 언제 실행될 지 이벤트 발생에 의해 전적으로 결정
반대되는 개념 : 배치 실행(batch programming)
프로그램의 개발자가 프로그램의 흐름을 결정하는 방식
이벤트 기반 프로그램의 구조
이벤트 리스너 들의 집합
이벤트 처리 순서
이벤트 발생(예 : 마우스나 키보드의 움직임 혹은 입력)
이벤트 객체 생성
현재 발생한 이벤트에 대한 정보를 가진 객체
이벤트 리스너 찾기
이벤트 리스너 호출
이벤트 객체가 리스너에 전달됨
이벤트 리스너 실행
이벤트 관련 용어
이벤트 소스
이벤트를 발생시킨 GUI 컴포넌트
이벤트 객체
발생한 이벤트에 대한 정보
예 : 이벤트 종류,이벤트 소스,화면 좌표,마우스 버튼 종류, ...
이벤트 리스너
이벤트를 처리하는 코드
컴포넌트에 등록되어야 작동 가능
이벤트 분배 스레드
동작
자바 가상 기계로부터 이벤트의 발생을 통지 받음
이벤트 소스와 이벤트 종류 결정
적절한 이벤트 객체 생성, 이벤트 리스너를 찾아 호출
무한 루프를 실행하는 스레드
이벤트 객체
이벤트가 발생할 때, 발생한 이벤트에 관한 정보를 가진 객체
이벤트 리스너에 전달됨
이벤트 리스너 코드에서 이벤트가 발생한 상황을 파악할 수 있게 함
이벤트 객체의 종류
EventObject
>>
AWTEvent ListSelectionEvent
>>
componentEvent ItemEvent ...
이벤트 객체에 포함된 정보
이벤트 종류
이벤트 소스
이벤트가 발생한 화면 좌표
이벤트가 발생한 컴포넌트 내 좌표
버튼이나 메뉴 아이템에 이벤트가 발생한 경우 버튼이나 메뉴 아이템의 문자열
클릭된 마우스 버튼 번호
마우스 클릭 횟수
키가 눌러졌다면 키의 코드 값과 문자 값
체크박스,라디오버튼 등과 같은 컴포넌트에 이벤트가 발생하였다면 체크상태
이벤트에 따라 조금씩 다른 정보 포함
ActionEvent 객체 : 액션 문자열
MouseEvent 객체 : 마우스 위치 정보,마우스 버튼,함께 눌러진 키 정보 등
ItemEvent 객체 : 아이템의 체크 상태
이벤트 소스 알아 내기
object EventObject.getSource()
발생한 이벤트 소스 컴포넌트 리턴
object타입으로 리턴하므로 캐스팅하여 사용
모든 이벤트 객체에 대해 적용
이벤트 객체와 이벤트 소스
ActionEvent
1.JButton
2.JmenuItem
3.JTextField
ItemEvent
1.JCheckBox
2.JRadioButton
3.JCheckBoxMenuItem
ListSelectionEvent
JList
...
이벤트 리스너(Event Listener)
이벤트를 처리하는 코드,클래스로 작성
JDK에서 이벤트 리스너 작성을 위한 인터페이스 제공
개발자가 리스너 인터페이스 추상 메소드 구현
이벤트가 발생하면 자바 플랫폼은 리스너 인터페이스의 추상 메소드 호출
ActionListener 인터페이스
interface ActionListener{ // 아래 메소드를 개발자가 구현해야 함 public void actionPerformed(ActionEvent e); // Action 이벤트 발생시 호출 됨 }
*** 리스너 등록 메소드가 addxxxListener인 이유 ***
컴포넌트는 다른 이벤트에 대한 리스너를 동시에 가질 수 있다.
JButton.addActionListener
JButton.addkeyListener
JButton.addFocusListener
컴포넌트는 한 이벤트에 대해 여러 개의 리스너를 동시에 가질 수 있다.
JButton.addActionListener(new myButtonListner1());
JButton.addActionListener(new myButtonListner2());
JButton.addActionListener(new myButtonListner3());
이벤트 리스너 작성 방법
3가지 방법
1.독립 클래스로 작성
이벤트 리스너를 완전한 클래스로 작성
이벤트 리스너를 여러 곳에서 사용할 때 적합
2.내부 클래스로 작성
클래스 안에 멤버처럼 클래스 작성
이벤트 리스너를 특정 클래스에서만 사용할 때 적합
3.익명 클래스로 작성
클래스의 이름 없이 간단히 리스너 작성
클래스조차 만들 필요 없이 리스너 코드가 간단한 경우에 적합
예제) 독립 클래스로 Action 이벤트의 리스너 작성
package project; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class IndepClassListner extends JFrame{ public IndepClassListner() { setTitle("action event listener Ex"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Action"); btn.addActionListener(new MyActionListener()); //actin 리스너 달기 c.add(btn); setSize(350,150); setVisible(true); } public static void main(String[] args) { new IndepClassListner(); } } class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(b.getText().equals("Action")) b.setText("액션"); else b.setText("Action"); } }
예제) 내부 클래스로 Action 이벤트의 리스너 작성
package project; import javax.swing.*; import java.awt.event.*; import java.awt.*; public class InnerClassListener extends JFrame { public InnerClassListener() { setTitle("Action 이벤트 리스너 예제"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container c = getContentPane(); c.setLayout(new FlowLayout()); JButton btn = new JButton("Action"); btn.addActionListener(new MyActionListener()); c.add(btn); setSize(350, 150); setVisible(true); } private class MyActionListener implements ActionListener { public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(b.getText().equals("Action")) b.setText("액션"); else b.setText("Action"); //innerClassLisenter의 멤버나 JFrame의 멤버를 호출할 수 있음 InnerClassListener.this.setTitle(b.getText()); //프레임 타이틀에 버튼 문자열을 출력한다. } } public static void main(String [] args) { new InnerClassListener(); }}
익명 클래스로 이벤트 리스너 작성
익명 클래스
(클래스 정의 + 인스턴스 생성)을 한번에 작성
new 익명클래스의 수퍼클래스이름(생성자의 인자들){
..............
멤버구현
...............
}
예제) 익명 클래스로 Action이벤트 리스너 만들기
package project; 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() { public void actionPerformed(ActionEvent e) { JButton b = (JButton)e.getSource(); if(b.getText().equals("Action")) b.setText("액션"); else b.setText("Action"); setTitle(b.getText()); } }); setSize(350, 150); setVisible(true); } public static void main(String [] args) { new AnonymousClassListener(); } }
반응형'Languages > Java' 카테고리의 다른 글