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 패키지
📝 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번 버튼");
}
/****************/
}
}
📃 빙고게임
💾 소스코드
💬 조건
- 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
반응형
'Language > JAVA' 카테고리의 다른 글
JAVA 10일차 - 예외 처리 (0) | 2022.07.01 |
---|---|
JAVA 10일차 - 마우스 이벤트 리스너 (0) | 2022.07.01 |
JAVA 9일차 - GUI 패키지, AWT, Swing 클래스 (0) | 2022.06.30 |
JAVA 9일차 - Abstract(추상화), Interface(인터페이스) (0) | 2022.06.30 |
JAVA 8일차 - 다형성 (0) | 2022.06.29 |
댓글