본문 바로가기
Language/JAVA

JAVA 9일차 - 이벤트 리스너

by 코젼 2022. 6. 30.
728x90
반응형

 

💡 이벤트 리스너

💬 독립 클래스로 작성
- 이벤트 리스너를 완전한 클래스로 작성
- 이벤트 리스너를 여러 곳에서 사용할 때 적합

💬 내부 클래스로 작성
- 클래스 안에 멤버처럼 클래스 작성
- 이벤트 리스너를 특정 클래스에서만 사용할 때 적합

💬 익명 클래스로 작성
- 클래스의 이름 없이 간단히 리스너로 작성(1)
- 클래스 조차 만들 필요 없이 리스너 코드가 간단한 경우에 적합(2)

📃 독립 클래스 예제

💾 소스코드

IndepClassListener.java
0.00MB
MyActionListener.java
0.00MB


📂 listener 패키지

📝 MyActionListener클래스

package listener;

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

// MyActionListener 이름을 가진 class
public class MyActionListener implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("버튼 클릭");
	}
}

📝 IndepClassListener 클래스

package listener;

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class IndepClassListener extends JFrame {
	static final String STR_ACTION_E = "Action";
	static final String STR_ACTION_K = "액션";
	
	public IndepClassListener() {
		setTitle("Action 이벤트 독립 클래스 리스너 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container c = getContentPane();
		c.setLayout(new FlowLayout());
		
		JButton btn = new JButton(STR_ACTION_E);
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		setSize(250, 120);
		setVisible(true);
	}
	public static void main(String[] args) {
		new IndepClassListener();
	}
}

📃 익명 클래스 예제(1)

💾 소스코드

AnonymousClassListener.java
0.00MB


📝 AnonymousClassListener 클래스

package listener;

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class AnonymousClassListener extends JFrame {
	static final String STR_ACTION_E = "Action";
	static final String STR_ACTION_K = "액션";
	
	public AnonymousClassListener() {
		setTitle("Action 이벤트 익명 클래스 리스너 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());

		JButton btn = new JButton(STR_ACTION_E);
		// 익명 클래스 사용
		btn.addActionListener(lis); 
		c.add(btn);
		setSize(250, 120);
		setVisible(true);
	}

	public static void main(String[] args) {
		new AnonymousClassListener();
	}

	// 익명 클래스 - 이름이 존재하지 않는 클래스, 객체 생성
	// public class MyActionListener implements ActionListener {} 와 동일
	ActionListener lis = new ActionListener() {

		@Override
		public void actionPerformed(ActionEvent e) {
			System.out.println("버튼 클릭");
		}
	};
}

📃 익명 클래스 예제(2)

💾 소스코드

AnonymousClassListener2.java
0.00MB


📝 AnonymousClassListener2 클래스

package listener;

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

import javax.swing.JButton;
import javax.swing.JFrame;

public class AnonymousClassListener2 extends JFrame {
	static final String STR_ACTION_E = "Action";
	static final String STR_ACTION_K = "액션";
	
	public AnonymousClassListener2() {
		setTitle("Action 이벤트 익명 클래스 리스너 예제 2");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		Container c = getContentPane();
		c.setLayout(new FlowLayout());

		JButton btn = new JButton(STR_ACTION_E);
		// 익명 클래스 정의 및 사용
		btn.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("클릭3");
			}
		});
		c.add(btn);
		setSize(250, 120);
		setVisible(true);
	}

	public static void main(String[] args) {
		new AnonymousClassListener();
	}
}

 

💡 이벤트 리스너 인터페이스


📃 버튼 1, 2, 3을 만들고 각 버튼을 누를 때마다

1번 버튼, 2번 버튼, 3번 버튼이 출력되도록 하시오.

💬 버튼 1 - 내부 클래스로 작성
💬 버튼 2 - 익명 클래스(1)로 작성
💬 버튼 3 - 익명 클래스(2)로 작성

💾 소스코드

buttonListener.zip
0.00MB

📂 ButtonListener 패키지

📝 ButtonListener, ButtonMain 클래스

⚡ 알아낸 점?

- 자손[JButton - Object]조상

- e.getSource()는 Object 타입으로 반환하기 때문에 형변환을 하지 않으면 접근할 수 없다.

package buttonListener;

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

import javax.swing.JButton;
import javax.swing.JFrame;


public class ButtonListener extends JFrame{
	public ButtonListener() {
		setTitle("버튼 이벤트 리스너");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container pane = getContentPane();
		pane.setLayout(new FlowLayout());
		
		// 버튼 1 - 내부 클래스 사용
		JButton btn1 = new JButton("1");
		btn1.addActionListener(new ButtonMain());
		
		// 버튼 2 - 익명 클래스(1) 사용
		JButton btn2 = new JButton("2");
		btn2.addActionListener(lis);
		
		// 버튼 3 - 익명 클래스(2) 사용
		JButton btn3 = new JButton("3");
		btn3.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("3번 버튼");
			}
		});
		
		pane.add(btn1);
		pane.add(btn2);
		pane.add(btn3);
		
		setSize(300,100);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new ButtonListener();
	}
	
	// 익명 클래스(1) 사용
	ActionListener lis = new ActionListener() {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource(); // 버튼 가져오기
			if(b.getText().equals("1"))
				System.out.println("1번 버튼");
			else if(b.getText().equals("2"))
				System.out.println("2번 버튼");
			else
				System.out.println("3번 버튼");
			
		}
	};
	
	// 내부 클래스 사용
	class ButtonMain implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
        // 자손[JButton - Object]조상
        // e.getSource()는 Object 타입으로 반환하기 때문에 형변환을 하지 않으면 접근할 수 없다.
			JButton b = (JButton)e.getSource(); // 버튼 가져오기
			if(b.getText().equals("1"))
				System.out.println("1번 버튼");
			else if(b.getText().equals("2"))
				System.out.println("2번 버튼");
			else
				System.out.println("3번 버튼");
			
		}
	}

}

💬 클래스 변수로 버튼을 선언한 뒤 [lis]와 [📝ButtonMain 클래스]에서 접근해보자!

package buttonListener;

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

import javax.swing.JButton;
import javax.swing.JFrame;


public class ButtonListener extends JFrame{
	
	/******** 수정 ********/
	JButton btn1;
	JButton btn2;
	JButton btn3;
	/****************/
	
	public ButtonListener() {
		setTitle("버튼 이벤트 리스너");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		Container pane = getContentPane();
		pane.setLayout(new FlowLayout());
		
		// 버튼 1 - 내부 클래스 사용
		btn1 = new JButton("1");
		btn1.addActionListener(new ButtonMain());
		
		// 버튼 2 - 익명 클래스(1) 사용
		btn2 = new JButton("2");
		btn2.addActionListener(lis);
		
		// 버튼 3 - 익명 클래스(2) 사용
		btn3 = new JButton("3");
		btn3.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("3번 버튼");
			}
		});
		
		pane.add(btn1);
		pane.add(btn2);
		pane.add(btn3);
		
		setSize(300,100);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new ButtonListener();
	}
	
	// 익명 클래스(1) 사용
	ActionListener lis = new ActionListener() {
		/******** 수정 ********/
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource(); // 버튼 가져오기
			if(b.equals(btn1))
				System.out.println("1번 버튼");
			else if(b.equals(btn2))
				System.out.println("2번 버튼");
			else
				System.out.println("3번 버튼");
			
		}
		/****************/
	};
	
	// 내부 클래스 사용
	class ButtonMain implements ActionListener{
		@Override
		/******** 수정 ********/
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton)e.getSource(); // 버튼 가져오기
			if(b.equals(btn1))
				System.out.println("1번 버튼");
			else if(b.equals(btn2))
				System.out.println("2번 버튼");
			else
				System.out.println("3번 버튼");
			
		}
		/****************/
	}

}

📃 빙고게임

💾 소스코드

Bingo.java
0.00MB


💬 조건
- setBounds(x, y, w, h) 를 이용한다.
- x = 50
- y = 100
- w, h = 60 (정사각형)

📂 bingo 패키지

📝 Bingo 클래스

⚡ 알아낸 점?

- 일반적으로 배열을 만들 때와 JButton 배열을 만들 때의 차이점
JButton[] arr_btns = new JButton[25];
int[] arr = new int[25];

arr[0] = 1;
arr_btns[0] = new JButton();

package bingo;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Bingo extends JFrame {
	final int MAX_NUM = 25;
	final int SQUARE = 5;
	final int x = 50;
	final int y = 100;
	final int width = 60;
	final int height = 60;
	final int location = 70;

	JButton[] btn = new JButton[MAX_NUM];
	int[] number = new int[25];

	public Bingo() {
		setTitle("빙고게임!");

		Container pane = getContentPane();
		// 배치관리자 제거
		pane.setLayout(null);

		setSize(500, 500);

		JLabel label = new JLabel("빙고 게임");
		label.setBounds(x, y-50, width, height);
		pane.add(label);
		
		// 난수 발생
		int temp = 0;
		for(int i=0; i<number.length; i++) {
			number[i] = i+1; //1~25 숫자 number배열에 넣기
		}
		for(int i=0; i<number.length*3; i++) {
			int r = (int)(Math.random()*number.length);
			// 첫 번째 값 고정하고 비교하면서 나머지 섞기
			temp = number[r];
			number[r] = number[0]; 
			number[0] = temp;
		}
		
		// k라는 변수를 하나 만들어서, btn배열의 0~24 인덱스에 모두 접근할 수 있도록 한다.
		int k = 0;
		for (int i = 0; i < SQUARE; i++) {
			for(int j=0; j<SQUARE; j++) {
				// 인덱스에 k++를 해서 btn배열의 0~24에 모두 접근하여 값을 넣을 수 있도록 한다.
				btn[j] = new JButton(number[k++] + ""); 
				btn[j].setBounds(x + (location*j), y + (location*i), width, height);
				pane.add(btn[j]);
				btn[j].addActionListener(new ButtonListener());
			}
		}

		setVisible(true);
	}

	public static void main(String[] args) {

		new Bingo();
	}

	class ButtonListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			JButton b = (JButton) e.getSource();
			if(b.getBackground() == (Color.cyan)) {
				b.setBackground(null);
			}
			else {
				b.setBackground(Color.cyan);
			}
		}

	}
}

 

728x90
반응형

댓글