simDev1234
심플하고 차분하게
simDev1234
전체 방문자
오늘
어제
  • 분류 전체보기
    • Computer Science
      • Basic Math
      • Data Structure
      • Algorithm
      • Database
      • OS
    • Language
      • Java
      • Kotlin
      • SQL
    • Framework
      • Spring
      • Orm&Mapper
      • 프로젝트로 스프링 이해하기
      • 스프링 라이브러리
    • Infra
      • Cloud
      • Docker
      • Redis
      • AWS, Azure
      • Device
    • Etc
      • CleanCoding
    • Git,Github

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • controllerTest
  • JVM메모리구조
  • 404
  • 참조타입
  • 자바프로그래밍
  • 자바
  • 참조변수
  • 자바프로그램
  • 컨트롤러
  • 스프링
  • null
  • 자바메모리구조
  • scanner #next() #nextLine()

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
simDev1234

심플하고 차분하게

[자바API_AWT/Swing] 버튼 이벤트 구현하기
Language/Java

[자바API_AWT/Swing] 버튼 이벤트 구현하기

2022. 3. 28. 00:53

■ 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();
	}
}

 

 

[참조]

- 국비지원 수업 내용 참조

'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
    'Language/Java' 카테고리의 다른 글
    • [자바_예제] 2차원 배열_로또 추첨
    • [자바API_AWT/Swing] 키보드 이벤트 구현하기
    • [자바API_AWT/Swing] 배치관리자와 레이아웃 종류(2)_윈도우창(JFrame) 예제
    • [자바의정석_예제] 객체지향프로그래밍1
    simDev1234
    simDev1234
    TIL용 블로그. * 저작권 이슈가 있는 부분이 있다면 댓글 부탁드립니다.

    티스토리툴바