■ xxxListener/xxxEvent/Action 관계

- 비유 참고 링크 : https://stackoverflow.com/questions/23033439/what-is-the-difference-between-actionlistener-and-actionevent-for-a-button

   [비유] 상점 주인
   - 상점 주인이 가게에 들어와 직원들을 살핀다.
   - 그는 뭔가 문제가 발생한다면 행동을 할 준비를 하고 있다.(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();
	}
}

 

 

[참조]

- 국비지원 수업 내용 참조

+ Recent posts