Salted Caramel

[수업 18일차] 21.08.26 GUI(화면구현2),Event Handler(이벤트 핸들러), 이벤트 리스너, Adapter 클래스 본문

coding/[2021.08.02~2022.01.24] 수업복습

[수업 18일차] 21.08.26 GUI(화면구현2),Event Handler(이벤트 핸들러), 이벤트 리스너, Adapter 클래스

꽃무늬라떼 2021. 8. 26. 22:25
13_GUI

package : sist

class : Ex21_Layout01

package sist;

import java.awt.BorderLayout;

import javax.swing.*;

//간단한 계산기 화면을 구성해 보자.

public class Ex21_Layout01 extends JFrame{

	public Ex21_Layout01() {
		
		setTitle("계산기 예제");
		
		// 컨테이너 3개를 만들어 보자.
		JPanel container1 = new JPanel();	//상단 컴포넌트들이 들어갈 컨테이너
		JPanel container2 = new JPanel();	// 중앙  컴포넌트가 들어갈 컨테이너
		JPanel container3 = new JPanel(); 	// 하단 컴포넌트들이 들어갈 컨테이너
		
		// 1. 컴포넌트를 만들어 보자.
		// 1-1. 상단 컨테이너에 들어갈 컴포넌트들을 만들자.
		
		JLabel jl1 = new JLabel("수 1 : ");
		JTextField su1 = new JTextField(5);
		
		JLabel jl2 = new JLabel("수 2 : ");
		JTextField su2 = new JTextField(5);
		
		JLabel jl3 = new JLabel("연산자 : ");
		JTextField op = new JTextField(1);
		
		// 1-2. 중앙 컨테이너에 들어갈 컴포넌트들을 만들자.
		JTextArea jta = new JTextArea(5,20);
		JScrollPane jsp = new JScrollPane(
				jta, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
				
		jta.setLineWrap(true);      // 자동 줄 바꿈 기능 설정
				
				
		// 1-3. 하단 컨테이너에 들어갈 컴포넌트들을 만들자.
		JButton result = new JButton("계산");
		JButton exit = new JButton("종 료");
		JButton cancel = new JButton("취 소");
		
		
		
		//2. 컨테이너에 컴포넌트를 추가해 주어야 한다.
		//2-1. 상단 컨테이너에 들어갈 컴포넌트들을 추가해 주자.
		container1.add(jl1);container1.add(su1);
		container1.add(jl2);container1.add(su2);
		container1.add(jl3);container1.add(op);
		
		
		//2-2. 중앙 컨테이너에 들어갈 컴포넌트들을 추가해 주자.
		container2.add(jsp);
		
		//2-3. 하단 컨테이너에 들어갈 컴포넌트들을 추가해 주자.
		container3.add(result);
		container3.add(exit);container3.add(cancel);
		
		//3. 프레임에 3개의 컨테이너를 올리되, 배치를 해서 올리자.
		add(container1, BorderLayout.NORTH);
		add(container2, BorderLayout.CENTER);
		add(container3, BorderLayout.SOUTH);
		
		setBounds(200, 200, 350, 250);
		
		// pack() : JFram에 올라온 컴포넌트(내용물)에 알맞게 프레임의 크기를 
		// 조절해 주는 메서드
		pack();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		
	}
	
	public static void main(String[] args)  {
		new Ex21_Layout01();
	}

}

13_GUI

package : sist

class : Ex22_Layout02

package sist;

import java.awt.BorderLayout;

import javax.swing.*;

//(연산자가 생겨서 옆으로 늘어난 경우)

public class Ex22_Layout02 extends JFrame {

	public Ex22_Layout02() {
		
		setTitle("계산기 예제 - 2");
		
		//컨테이너 3개 만들어 보자
		JPanel container1 = new JPanel();	//상단 컨테이너
		JPanel container2 = new JPanel();	//하단 컨테이너
		
		//1. 컴포넌트를 만들어 보자.
		//1-1 상단 컨테이너에 들어갈 컴포넌트들을 만들어 주자.
		JLabel jl1 = new JLabel("수 1 : ");
		JTextField su1 = new JTextField(5);
		
		JLabel jl2 = new JLabel("수 2 : ");
		JTextField su2 = new JTextField(5);
		
		JLabel jl3 = new JLabel("연산자 : ");
		JRadioButton jrb1 = new JRadioButton("+");
		JRadioButton jrb2 = new JRadioButton("-");
		JRadioButton jrb3 = new JRadioButton("*");
		JRadioButton jrb4 = new JRadioButton("/");
		
		ButtonGroup bg = new ButtonGroup();
		bg.add(jrb1);bg.add(jrb2);bg.add(jrb3);bg.add(jrb4);
		
				
		//1-2 중앙 들어갈 컴포넌트들을 만들어 주자.
		JTextArea jta = new JTextArea(5, 25);
		JScrollPane jsp = new JScrollPane(
				jta, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		jta.setLineWrap(true);
		
		//1-3 하단 컨테이너에 들어갈 컴포넌트들을 만들어 주자. 
		JButton button1 = new JButton("계  산");
		JButton button2 = new JButton("종  료");
		JButton button3 = new JButton("취  소");
		
		
		//2. 컨테이너에 컴포넌트를 추가해 주어야 한다.
		//2-1 상단 컨테이너에 컴포넌트(1-1)들을 추가해 주자.
		container1.add(jl1);container1.add(su1);
		container1.add(jl2);container1.add(su2);
		container1.add(jl3);
		container1.add(jrb1);container1.add(jrb2);
		container1.add(jrb3);container1.add(jrb4);
		
		//2-2 중앙 컨테이너에 컴포넌트(1-2)들을 추가해 주자.
		//container2.add(jta);
		
		//2-3 하단 컨테이너에 컴포넌트(1-2)들을 추가해 주자.
		container2.add(button1);container2.add(button2);
		container2.add(button3);
		
		
		//3. 프레임에 컨테이너를 추가해 줄 때 배치관리를 통해서 추가해 주자.
		add(container1,BorderLayout.NORTH);
		add(jsp,BorderLayout.CENTER);
		add(container2,BorderLayout.SOUTH);
		
		pack();
		setBounds(200, 200, 450, 200);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		
	}
	
	public static void main(String[] args) {
	
		new Ex22_Layout02();
	}

}

13_GUI

package : sist

class : Ex23_Layout03

 

package sist;

import java.awt.BorderLayout;

import javax.swing.*;

public class Ex23_Layout03 extends JFrame {

	public Ex23_Layout03() {
		
		setTitle("계산기 예제 - 3");
		
		JPanel container1 = new JPanel();  //상단 컨테이너
		JPanel container2 = new JPanel();  //상단 컨테이너
		JPanel container3 = new JPanel();  //중앙 컨테이너
		JPanel container4 = new JPanel();  //하단 컨테이너
		
		// 1. 컴포넌트를 만들어 보자.
		// 1-1. 상단 컨테이너(container1) 에 들어갈 컴포넌트를 만들자.
		JLabel jl1 = new JLabel("수 1 : ");
		JTextField su1 = new JTextField(5);
		
		JLabel jl2 = new JLabel("수 2 : ");
		JTextField su2 = new JTextField(5);
		
		// 1-2. 상단 컨테이너(container2) 에 들어갈 컴포넌트를 만들자.
		
		JLabel jl3 = new JLabel("연산자 : ");
		JRadioButton jrb1 = new JRadioButton("+");
		JRadioButton jrb2 = new JRadioButton("-");
		JRadioButton jrb3 = new JRadioButton("*");
		JRadioButton jrb4 = new JRadioButton("/");
		
		ButtonGroup bg = new ButtonGroup();
		bg.add(jrb1);bg.add(jrb2);bg.add(jrb3);bg.add(jrb4);
		
		// 1-3. 중앙 컨테이너(container3) 에 들어갈 컴포넌트를 만들자.
		JTextArea jta = new JTextArea(5, 25);
		JScrollPane jsp = new JScrollPane(
				jta, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		jta.setLineWrap(true);
		
		// 1-4. 하단 컨테이너(container4) 에 들어갈 컴포넌트를 만들자.
		JButton result = new JButton("계  산");
		JButton exist = new JButton("종  료");
		JButton cancel = new JButton("취  소");
		
		// 2. 컨테이너에 컴포넌트들을 올려야 한다.
		// 2-1. 상단 컨테이너(container1)에 올릴 컴포넌트(1-1)들을 올려 주자.
		container1.add(jl1);container1.add(su1);
		container1.add(jl2);container1.add(su2);
		
		
		// 2-2. 상단 컨테이너(container2)에 올릴 컴포넌트(1-2)들을 올려 주자.
		container2.add(jl3);
		container2.add(jrb1);container2.add(jrb2);
		container2.add(jrb3);container2.add(jrb4);
		
		
		// 2-3. 중앙 컨테이너(container3)에 올릴 컴포넌트(1-3)들을 올려 주자.
		container3.add(jsp);
		
		
		// 2-4. 하단 컨테이너(container4)에 올릴 컴포넌트(1-4)들을 올려 주자.
		container4.add(result);
		container4.add(exist);container4.add(cancel);
		
		// 새로운 컨테이너 2개를 만들자. 
		JPanel group1 = new JPanel(new BorderLayout());
		
		
		//새로운 컨테이너에 기존의 컨테이너를 올려주자.
		//group1.add(container1,BorderLayout.NORTH);
		group1.add(container2,BorderLayout.NORTH);
		group1.add(container3,BorderLayout.CENTER);
		group1.add(container4,BorderLayout.SOUTH);
		
		
		// 3. 프레임에 각각의 컨테이너들을 배치관리하여 올려주어야 한다.
		add(container1,BorderLayout.NORTH);
		add(group1,BorderLayout.CENTER);
		
		
		//add(container1,BorderLayout.NORTH);
		//add(container2,BorderLayout.NORTH);
		//add(container3,BorderLayout.CENTER);
		//add(container4,BorderLayout.SOUTH);
		
		
		setBounds(200, 200, 300, 300);

		pack();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		
	}
	
	public static void main(String[] args) {
		
		new Ex23_Layout03();

	}

}

13_GUI

package : sist

class : Ex24_Layout04

package sist;

import java.awt.BorderLayout;

import javax.swing.*;

//성적 처리

public class Ex24_Layout04 extends JFrame{

	public Ex24_Layout04() {
		
		setTitle("성적 처리");

		//컨테이너 만들기
		JPanel container1 = new JPanel();	// north-1 컨테이너
		JPanel container2 = new JPanel();   // north-2 컨테이너
		JPanel container3 = new JPanel();   // south 컨테이너
		//JPanel container4 = new JPanel();
		
		// 1. 컴포넌트를 만들어보자.
		// 1-1 north-1 컨테이너에 들어갈 컴포넌트를 만들자.
		
		JLabel jl1 = new JLabel("이 름 : ");
		JTextField name = new JTextField(10);
		
		// 1-2. north-2 컨테이너에 들어갈 컴포넌트를 만들자.
		JLabel jl2 = new JLabel("국 어 : ");
		JTextField su1 = new JTextField(3);
		
		JLabel jl3 = new JLabel("영 어 : ");
		JTextField su2 = new JTextField(3);
		
		JLabel jl4 = new JLabel("수 학 : ");
		JTextField su3 = new JTextField(3);
		
		// 1-3 중앙 컨테이너에 들어갈 컴포넌트 만들기
		JTextArea jta = new JTextArea(5,25);
		JScrollPane jsp = new JScrollPane(
				jta, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		jta.setLineWrap(true);
		
		// 1-4 하단 컨테이너에 들어갈 컴포넌트
		JButton result = new JButton("계산");
		JButton exit = new JButton("종료");
		JButton cancel = new JButton("취소");
		
		
		//2. 컨테이너에 컴포넌트 올리기
		//2-1 north-1 컨테이너에 올라갈 컴포넌트를 추가해 주자.
		container1.add(jl1); container1.add(name);
		
		// 2-2. north-2 컨테이너에 올라갈 컴포너트를 추가해 주자
		container2.add(jl2); container2.add(su1);
		container2.add(jl3); container2.add(su2);
		container2.add(jl4); container2.add(su3);
		
		
		//container3.add(jta);
		
		// 2-3 south 컨테이너에 올라갈 컴포넌트를 추가해 주자.
		container3.add(result);
		container3.add(exit);
		container3.add(cancel);
		
	// 새로운 컨테이너 만들자
		JPanel group1 = new JPanel(new BorderLayout());
		
		
		group1.add(container2,BorderLayout.NORTH);
		group1.add(jsp,BorderLayout.CENTER);
		group1.add(container3,BorderLayout.SOUTH);
		
		
		
		// 3. 프레임에 컨테이너 올리자
		//add(container1,BorderLayout.NORTH);
		//add(container2,BorderLayout.CENTER);
		//add(container3,BorderLayout.SOUTH);
		
		add(container1,BorderLayout.NORTH);
		add(group1,BorderLayout.CENTER);
		
		
		setBounds(200, 200, 300, 300);		
		
		pack();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		
	}
	
	public static void main(String[] args) {
		new Ex24_Layout04();
	}

}

 


13_GUI

package : sist

class : Ex25_Layout05

package sist;

import java.awt.BorderLayout;

import javax.swing.*;

//커피 자판기 화면 구현

public class Ex25_Layout05 extends JFrame {

	public Ex25_Layout05() {
		
		setTitle("커피 자판기");
		
		JPanel container1 = new JPanel();   // north-1 컨테이너
		JPanel container2 = new JPanel();   // north-2 컨테이너
		JPanel container3 = new JPanel();   // north-3 컨테이너
		JPanel container4 = new JPanel();   // south 컨테이너
		
		
		
		// 1. 컴포넌트를 만들어 보자.
		// 1-1 north-1 컨테이너에 들어갈 컴포넌트를 만들자.
		JLabel jl1 = new JLabel("원하는 커피 선택");
		// 1-2. north-2 컨테이너에 들어갈 컴포넌트를 만들자. 
		JRadioButton button1 = new JRadioButton("아메리카노(2500)");
		JRadioButton button2 = new JRadioButton("카페모카(3500)");
		JRadioButton button3 = new JRadioButton("에스프레소(2500)");
		JRadioButton button4 = new JRadioButton("카페라떼(4000)");
		
		ButtonGroup bg = new ButtonGroup();
		bg.add(button1);bg.add(button2);bg.add(button3);bg.add(button4);
		
		JLabel jl2 = new JLabel("수 량 : ");
		JTextField amount = new JTextField(7);
		
		JLabel jl3 = new JLabel("입금액 : ");
		JTextField money = new JTextField(7);
		
		
		//중앙에 들어갈 컴포넌트를 만들자
		JTextArea jta = new JTextArea(5,20);
		JScrollPane jsp = new JScrollPane(
				jta, 
				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, 
				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
				
		jta.setLineWrap(true);    
		
    	//1-4 south 컨테이너에 들어갈 컴포넌트를 만들자.
		JButton result = new JButton("계산");
		JButton exit = new JButton("종료");
		JButton cancel = new JButton("취소");
		
		// 2. 컨테이너에 컴포넌트를 추가해 주어야 한다.
		// 2-1. north-1 컨테이너에 들어갈 컴포넌트를 만들자. 
		container1.add(jl1);
		
		// 2-2.north-2 컨테이너에 들어갈 컴포넌트를 올리자.
		container2.add(button1);container2.add(button2);
		container2.add(button3);container2.add(button4);
		
		// 2-3. north-3 컨테이너에 들어갈 컴포넌트를 올리자.
		container3.add(jl2);container3.add(amount);
		container3.add(jl3);container3.add(money);
		
		//container4.add(jta);
		// 2-1. south 컨테이너에 들어갈 컴포넌트를 올리자.
		container4.add(result);container4.add(exit);container4.add(cancel);
		
		
		//새로운 컨테이너를 두 개 만들기
		JPanel group1 = new JPanel(new BorderLayout());
		JPanel group2 = new JPanel(new BorderLayout());
		
		// group1 컨테이너에는 container1, contaner2를 올려주자.
		
		group1.add(container1,BorderLayout.NORTH);
		group1.add(container2,BorderLayout.CENTER);
		group1.add(container3,BorderLayout.SOUTH);
		
		//// group1 컨테이너에는 container3, jsp, contaner4를 올려주자.
		group2.add(jta,BorderLayout.CENTER);
		group2.add(container4,BorderLayout.SOUTH);
		
		
		
		//3 프레임에 컨테이너를 추가해 주어야 한다.
		//add(container1,BorderLayout.NORTH);
		//add(container2,BorderLayout.CENTER);
		//add(container3,BorderLayout.SOUTH);
		
		add(container1,BorderLayout.NORTH);
		add(group1,BorderLayout.CENTER);
		add(group2,BorderLayout.SOUTH);
		
		
		
		setBounds(200, 200, 300, 300);
		
		pack();
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		setVisible(true);
		
	
		
		
	}
	
	public static void main(String[] args) {
		
		new Ex25_Layout05();

	}

}

 

컨테이너에 올리는 이유는 컴포넌트들이 여러개일 경우에 올리기 때문에 

1개이면 컨테이너에 올리지 않아도 된다.

 

 

 

 


 

windowbuilder

 


13_GUI

package : sist

class : Ex26_Event-Ex27-Ex28-Ex29

 *  Event Handler(이벤트 핸들러)?
 *  - 각 컴포넌트에 대하여 특정 행위를 하였을 때 그 행위에 대한
 *    작업을 처리할 수 있도록 하는 것을 말함.
 *    사용자 또는 프로그램에 의해 발생할 수 있는 하나의 사건.
 *  - 이벤트를 처리하는 자바 프로그램 코드로써 클래스를 만듦.
 *    이벤트 리스너는 인터페이스를 제공하며, 개발자는 이 인터페이스를 
 *    상속을 받고 추상메서드를 구현하여 이벤트 리스너를 작성한다.
 *  - 혀재 발생한 이벤트에 관한 정보를 가진 객체를 의미함. 이벤트 리스너에게 전달됨.
 *  ==> 예를 든다면 버튼을 눌렀다던지, 리스트 메뉴를 선택하였을 때 등등
 *  - 이벤트 처리 클래스 : java.awt.event 패키지 안에 있는 클래스.
 *  - 각 컴포넌트별 이벤트 처리 메서드 : add로 시작하여 Listener로 끝나는 메서드.
 *  - 이벤트 관련 클래스 : Listener 인터페이스, Adapter 클래스, Event 클래스
 *  - 이벤트 리스너는 모두가 다 인터페이스임(xxxListener)
 *    이벤트 리스너는 이벤트를 처리하는 프로그램 코드를 말함.
 *    이벤트 리스너는 컴포넌트에 연결되어 있어야 작동을 함.
 *    즉, 화면에 구성된 컴포넌트들은 이벤트 리스너를 하나씩 가지고 있음.
 *  - 컴포넌트와 리스너를 연결시키는 메서드 : addXXXXListener() ==> XXXX는 리스너 이름.
 *  - 이벤트 리스너 작성 과정
 *    1) 이벤트와 이벤트 리스너 선택 : 목적에 적합한 이벤트와 리스너 인터페이스 선택.
 *    2) 이벤트와 리스너 클래스 작성 : 리스너 인터페이스를 상속받은 클래스를 작성하고
 *                             추상메서드를 모두 구현.
 *    3) 이벤트 리스너 등록 : 이벤트를 받을 컴포넌트에 이벤트 리스너 등록.
 *    
 *    [이벤트 관련 용어]
 *    - 이벤트 소스 : 이벤트를 발생시킨 GUI 컴포넌트를 말함.
 *    - 이벤트 객체 : 발생한 이벤트에 대한 정보(이벤트 종류, 이벤트 소스, 화면 좌표,
 *                          마우스 버튼의 종류, 눌려진 키)를 담는 객체로써, 이벤트에 따라서
 *                          서로 다른 정보다 저장이 됨.
 *    - 이벤트 리스너(Event Listener) : - 이벤트를 처리하는 코드로써 컴포넌트에 
 *                                    등록이 되어야 작동이 가능함.
 *                                  - 이벤트 소스와 이벤트 핸들러를 연결.
 *                                  - 이벤트를 처리하는 객체를 말함.
 *
 */

/*
 * Event Handler 클래스 생성 방법 - 4가지
 * 1. Listener 클래스를 구현하는 방법.
 * 2. Adapter 클래스를 구현하는 방법.
 * 3. Frame 클래스에 Listener를 구현하는 방법. - 가장 많이 사용
 * 4. 익명의 클래스를 이용하는 방법 - 많이 사용.
package sist;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

/*
 *  Event Handler(이벤트 핸들러)?
 *  - 각 컴포넌트에 대하여 특정 행위를 하였을 때 그 행위에 대한
 *    작업을 처리할 수 있도록 하는 것을 말함.
 *    사용자 또는 프로그램에 의해 발생할 수 있는 하나의 사건.
 *  - 이벤트를 처리하는 자바 프로그램 코드로써 클래스를 만듦.
 *    이벤트 리스너는 인터페이스를 제공하며, 개발자는 이 인터페이스를 
 *    상속을 받고 추상메서드를 구현하여 이벤트 리스너를 작성한다.
 *  - 혀재 발생한 이벤트에 관한 정보를 가진 객체를 의미함. 이벤트 리스너에게 전달됨.
 *  ==> 예를 든다면 버튼을 눌렀다던지, 리스트 메뉴를 선택하였을 때 등등
 *  - 이벤트 처리 클래스 : java.awt.event 패키지 안에 있는 클래스.
 *  - 각 컴포넌트별 이벤트 처리 메서드 : add로 시작하여 Listener로 끝나는 메서드.
 *  - 이벤트 관련 클래스 : Listener 인터페이스, Adapter 클래스, Event 클래스
 *  - 이벤트 리스너는 모두가 다 인터페이스임(xxxListener)
 *    이벤트 리스너는 이벤트를 처리하는 프로그램 코드를 말함.
 *    이벤트 리스너는 컴포넌트에 연결되어 있어야 작동을 함.
 *    즉, 화면에 구성된 컴포넌트들은 이벤트 리스너를 하나씩 가지고 있음.
 *  - 컴포넌트와 리스너를 연결시키는 메서드 : addXXXXListener() ==> XXXX는 리스너 이름.
 *  - 이벤트 리스너 작성 과정
 *    1) 이벤트와 이벤트 리스너 선택 : 목적에 적합한 이벤트와 리스너 인터페이스 선택.
 *    2) 이벤트와 리스너 클래스 작성 : 리스너 인터페이스를 상속받은 클래스를 작성하고
 *                             추상메서드를 모두 구현.
 *    3) 이벤트 리스너 등록 : 이벤트를 받을 컴포넌트에 이벤트 리스너 등록.
 *    
 *    [이벤트 관련 용어]
 *    - 이벤트 소스 : 이벤트를 발생시킨 GUI 컴포넌트를 말함.
 *    - 이벤트 객체 : 발생한 이벤트에 대한 정보(이벤트 종류, 이벤트 소스, 화면 좌표,
 *                          마우스 버튼의 종류, 눌려진 키)를 담는 객체로써, 이벤트에 따라서
 *                          서로 다른 정보다 저장이 됨.
 *    - 이벤트 리스너(Event Listener) : - 이벤트를 처리하는 코드로써 컴포넌트에 
 *                                    등록이 되어야 작동이 가능함.
 *                                  - 이벤트 소스와 이벤트 핸들러를 연결.
 *                                  - 이벤트를 처리하는 객체를 말함.
 *
 */

/*
 * Event Handler 클래스 생성 방법 - 4가지
 * 1. Listener 클래스를 구현하는 방법.
 * 2. Adapter 클래스를 구현하는 방법.
 * 3. Frame 클래스에 Listener를 구현하는 방법. - 가장 많이 사용
 * 4. 익명의 클래스를 이용하는 방법 - 많이 사용.
 * 
 */



//1. Listener 클래스를 구현하는 방법.
class A  implements ActionListener{
	
		
	@Override
	public void actionPerformed(ActionEvent e) {
		//(여기에 이벤트 처리할 내용 적기)
		System.exit(0);  //(0값을 주면 종료)

	}
}


public class Ex26_Event extends JFrame {

	public Ex26_Event() {
		JPanel container = new JPanel();
		
		JButton jb = new JButton("종  료");
		
		container.add(jb);
		
		add(container);
		
		setBounds(200, 200, 300, 300);		
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
				
		A a = new A();
		
		jb.addActionListener(a);
		
	}
	
	public static void main(String[] args) {
		new Ex26_Event();

	}

}
package sist;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;

// 2. Adapter 클래스를 구현하는 방법.
class B extends MouseAdapter {   //(내가 원하는 것만 필요한 것만 overriding)

	@Override
	public void mouseClicked(MouseEvent e) {
		System.exit(0);
	}
}

public class Ex27_Event extends JFrame {

	public Ex27_Event() {

		JPanel container = new JPanel();
		
		JButton jb = new JButton("종  료");
		
		container.add(jb);
		
		add(container);
		
		setBounds(200, 200, 300, 300);		
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		B b = new B();
		
		jb.addMouseListener(b);
	}
	
	public static void main(String[] args) {
		
		new Ex27_Event();
		

	}

}
package sist;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.*;
//3. Frame 클래스에 Listener를 구현하는 방법. 
//(따로 클래스를 만들지 말고, 리스너를 구현하자, 불필요한 리스너들이 오버라이딩(단점)) 아답터는 못씀 다중상속이 안되기 때문에
public class Ex28_Event extends JFrame implements MouseListener{

	public Ex28_Event() {

		
		JPanel container = new JPanel();
		
		JButton jb = new JButton("종  료");
		
		container.add(jb);
		
		add(container);
		
		setBounds(200, 200, 300, 300);		
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	  jb.addMouseListener(this);//(자기자신에 마우스리스너가 있기때문에 연결시켜줌)
	}
	
	public static void main(String[] args) {
		new Ex28_Event();

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		System.exit(0);
		
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

}
package sist;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;


// 4. 익명 클래스를 이용하는 방법.
public class Ex29_Event extends JFrame {

	public Ex29_Event() {

		JPanel container = new JPanel();
		
		JButton jb = new JButton("종  료");
		
		container.add(jb);
		
		add(container);
		
		setBounds(200, 200, 300, 300);		
		
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
		jb.addActionListener(new ActionListener() {
			
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
				
			}
		});
		
	}
	
	public static void main(String[] args) {
		new Ex29_Event();

	}

}

 

이벤트 처리하는 방법

1.

인터페이스 상속

따로 클래스를 만들어서 actionlistener( 인터페이스)를 구현해 주어야한다. 

actionPerformed라는 추상메서드를 반드시 오버라이딩 줘야한다. 왜 인터페이스였기 때문에 추상메서드로만 구성되었기 때문에,  actionPerformed 메서드 안에는 실제로 할 내용만 지정해주면 된다. 

객체 생성하고 클래스에 참조 변수를 넣고 actionPerformed를 실행해주면된다. 

 

2.

adaptor 클래스(그 리스너를 구현한 클래스)

Mouselistener : 추상 메서드 5개 ==> 필요없는 코드 4개 

해결 방안( 내가 구현할 코드만 꺼내서 사용 가능)

==> adaptor 클래스 사용, 필요한 메서드만 overriding (불필요한 코드가 없다는 장점)

B 객체 생성 - b 참조 변수

B라는 클래스는 Mouselistener에 있는 모든 추상메서드를 overriding 해주어야한다.

5개의 overriding이 나오는데 한개의 추상메서드만 사용하게 되는데 나머지 들은 불필요하게만 남아 있게 된다. 

내가 필요한 것만 집어 넣는것을 adapter(아답터)를 이용한다.

컴포넌트와 리스너를 연결시키는 메서드 : addXXXXListener() ==> XXXX는 리스너 이름.

( ) : 이 안에는 인터페이스가 들어간다. ==> 괄호 안에 있는 값이 실제 실행하는 부분

은 항상 컴포넌트 안에 있다. 리스너만 찾아서 추상메서드를 overriding(재정의) 해주고 그 안에는 이벤트 처리할 내용을 작성해 주면 된다.  

: 완벽하게 overriding 시키지 않으면 추상 클래스가 된다.

그렇게 때문에 adaptor 클래스로 원하는 것만 overriding 해서 사용한다. 

 

3. ***가장 사용 많이 하는 방법

Frame 클래스에 Listener를 구현하는 방법. 
따로 클래스를 만들지 말고, 리스너를 구현하자,

불필요한 리스너들이 오버라이딩(단점) MouseAdaprt는 못씀 다중상속이 안되기 때문이다. ==> ListenerIntertface을 사용해 주어야 한다. ==> implements MouseListener ==> 5개의 추상 메서드가 오버라이딩 되어야 한다. 불필요한 4개의 코드가 overriding 

자기 자신 객체 this를 사용해서 MouseListener와 jb.addMouseListener(this)을 연결 시켜주자

(불필요한 코드가 overriding된다는 단점)

 

4.

익명 클래스를 이용하는 방법.

jb 에 이벤트가 발생. 

코드가 간결.

jb.addActionListener(new ActionListener() {
			
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
				
			}
		});
		
	}

표준) 대부분 3번째 implements 해서 이벤트 리스너 구현해서 overriding해서 필요한 부분만 처리.(코드가 길다)

4번은 한 곳에 집중이 되고 코드가 짧기 때문에 보기가 편한 장점이 있다. 

 

*인터페이스

*

 

 

아답터 가 있는지 없는지 API로 보고 참고하기.