■ xxxListener/xxxEvent/Action 관계
[비유] 상점 주인 - 상점 주인이 가게에 들어와 직원들을 살핀다. - 그는 뭔가 문제가 발생한다면 행동을 할 준비를 하고 있다.(ActionListner) - 직원A가 일할 시간에 또 사무실에서 잠을 자고 있다. - 그는 마음먹은대로 행동을 돌입해야겠다 생각한다.(AcitionEvent) - 그는 직원A에게 다음번에 자르겠다 경고한다.(Action) |
■ xxxListner와 xxxAdapter의 차이점
- XXXListener는 인터페이스다.
- XXXAdapter는 XXXListener를 구현한 추상클래스이며, 메소드들의 구현부에 { }만 작성되어 있다.
- XXXListener을 상속할 때는 내부 메소드를 모두 구현해야하지만, XXXAdapter를 상속할 때는 쓰고 싶은 메소드만 골라쓰면 되는 장점이 있다.
■ ActionListener를 구현하는 방법
1. 인스턴스 내부클래스 사용
package window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class EventTest extends JFrame{
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(EventTest.this, "Visible");
}
}
public EventTest(){
//윈도우 기본 세팅
super("EventListenr-인스턴스 내부 클래스");
setLocation(200,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
//버튼 추가
JButton jbt = new JButton("Click This");
this.add(jbt,"North");
//버튼 이벤트 추가
jbt.addActionListener(new ButtonListener());
setSize(400,400);
}
public static void main(String[] args) {
new EventTest();
}
}
>> 실행결과
2. 로컬 내부클래스 사용
package window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class EventTest extends JFrame{
public EventTest(){
//윈도우 기본 세팅
super("EventListenr-로컬 내부 클래스");
setLocation(200,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
//버튼 추가
JButton jbt = new JButton("Click This");
this.add(jbt,"North");
//버튼 이벤트 추가
class ButtonListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(EventTest.this, "Visible");
}
}
jbt.addActionListener(new ButtonListener());
setSize(400,400);
}
public static void main(String[] args) {
new EventTest();
}
}
3. 익명클래스 사용
package window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class EventTest extends JFrame{
public EventTest(){
//윈도우 기본 세팅
super("EventListenr-익명 클래스");
setLocation(200,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
//버튼 추가
JButton jbt = new JButton("Click This");
this.add(jbt,"North");
//버튼 이벤트 추가
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(EventTest.this, "Hello My World");
}
};
jbt.addActionListener(listener);
setSize(400,400);
}
public static void main(String[] args) {
new EventTest();
}
}
4. 람다식 사용
- (매개변수 -> 구현부)를 한 번에 쓰는 방식
package window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class EventTest extends JFrame{
public EventTest(){
//윈도우 기본 세팅
super("EventListenr-익명 클래스");
setLocation(200,200);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
//버튼 추가
JButton jbt = new JButton("Click This");
this.add(jbt,"North");
//버튼 이벤트 추가
//jbt.addActionListener(ActionListner i);
// ActionListener i 안에 매개변수 e가 있는 메소드로 가서,
// 구현부를 작성하기.
jbt.addActionListener((e)->{JOptionPane.showMessageDialog(EventTest.this, "Visible");});
setSize(400,400);
}
public static void main(String[] args) {
new EventTest();
}
}
■ 4가지 방법을 모두 한 번에 볼 수 있는 예제
package mymain;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class _04_Hello_Nation extends JFrame {
//Member로서의 내부클래스 선언
class ButtonEventObject implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "안녕하세요!!"); //null이면, 모니터의 정중앙 -> 윈도우창에 넣으면 창의 정중앙
JOptionPane.showMessageDialog(_04_Hello_Nation.this, "안녕하세요!!");
//내부클래스에서 외부클래스를 호출할 때는 _04_Hello_Nation.this
//내부클래스에서 내부클래스를 호출할 때는 this
}
}
public _04_Hello_Nation() {
super("각 나라 인사말");
GridLayout gl = new GridLayout(6,1);
this.setLayout(gl);
JButton jbt_kor = new JButton("한국어 인사말");
JButton jbt_eng = new JButton("영 어 인사말");
JButton jbt_jpn = new JButton("일본어 인사말");
JButton jbt_chn = new JButton("중국어 인사말");
JButton jbt_fra = new JButton("프랑스 인사말");
JButton jbt_ger = new JButton("독일어 인사말");
this.add(jbt_kor);
this.add(jbt_eng);
this.add(jbt_jpn);
this.add(jbt_chn);
this.add(jbt_fra);
this.add(jbt_ger);
//한국어 인사말
//jbt_kor 버튼 눌렀을 때 이벤트 등록(JVM에게 등록)
//이벤트 소트.addXXXListener (처리객체가 갖고 있는 interface)
ButtonEventObject listener = new ButtonEventObject();
jbt_kor.addActionListener(listener);
//영어 인사말
//로컬 내부 클래스(Local Inner Class)
class EngButtonEventObject implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
//System.out.println(e);
JOptionPane.showMessageDialog(_04_Hello_Nation.this, "Hi Everyone!");
}
}
jbt_eng.addActionListener(new EngButtonEventObject());
//일본어 인사말
//익명 내부 클래스
ActionListener listener2 = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(_04_Hello_Nation.this, "곤니치와");
}
};
jbt_jpn.addActionListener(listener2);
//중국어 인사말
jbt_chn.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JOptionPane.showMessageDialog(_04_Hello_Nation.this, "니하오마");
}
} );
//프랑스어 인사말
//람다식(Lambda) : 함수 또는 객체 축약식
jbt_fra.addActionListener(e->JOptionPane.showMessageDialog(_04_Hello_Nation.this, "봉쥬르"));
//독일어 인사말
jbt_ger.addActionListener((e) -> {JOptionPane.showMessageDialog(_04_Hello_Nation.this, "구덴 탁");});
//람다식 예시
//int a = 1, b = 2;
//int n = (a,b) -> {return a + b;};
//위치 x y
super.setLocation(200, 200);
//크기
super.setSize(400, 400);
//보여주기
this.setVisible(true);
//종료
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new _04_Hello_Nation();
}
}
[참조]
- 국비지원 수업 내용 참조
'Language > Java' 카테고리의 다른 글
[자바_예제] 2차원 배열_로또 추첨 (0) | 2022.03.28 |
---|---|
[자바API_AWT/Swing] 키보드 이벤트 구현하기 (0) | 2022.03.28 |
[자바API_AWT/Swing] 배치관리자와 레이아웃 종류(2)_윈도우창(JFrame) 예제 (0) | 2022.03.27 |
[자바의정석_예제] 객체지향프로그래밍1 (0) | 2022.03.27 |
[자바의정석_예제] 조건문과 반복문 (0) | 2022.03.27 |