⭐액션리스너 인터페이스
ActionListener
자바 개발자들이
운영체제(마우스 제어 주체)와
상호작용할 수 있도록 에비해둔 기능이다.
이를 위해 운영체제와 약속된 추상 메서드를 오버라이드 한다.
만약 이벤트가 발생되면 이 메서드를 수행하도록 하기 위해서다.
⭐콜백
callback
직접 수행하는 것이 아니라
미리 정해져 있는 정보(객체)를 받을 수 있게 하는 것
💀단, 어떤 컴포넌트가 이벤트를 실행시킬 것인지
먼저 등록해둬야 한다.
예제) 버튼에 상호작용 기능을 넣어보자
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
⭐구조
상속 JFrame/ 구현 ActionListener
멤버변수
JButton
생성자 (initData, setInitLayout, addEventListener)
메소드
initData (컴포넌트 정의)
setInitLayout (디자인)
addEventListener (상호작용)
오버라이드
actionPerformed
메인코드
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
package _swing2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 4.29
* 자바는 단일 상속만을 지원한다.
* (Object 제외)
*
* 이벤트 리스너 예제 코드를 만들면서 이해해 보자
*
* 액션리스너 인터페이스
* ActionListener
* 자바 개발자들이
* 운영체제(마우스 제어 주체)와
* 상호작용할 수 있도록 에비해둔 기능이다.
*/
public class ColorChangeFrame extends JFrame implements ActionListener {
/*
구조
-----
멤버
생성자
메서드
이너
메인
*/
//member
JButton button1 = new JButton();
//constructor
public ColorChangeFrame() {
initData();
setInitLayout();
addEventListener();
}
//method
private void initData() {
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button1 = new JButton("button1");
}
private void setInitLayout() {
//배치관리자 기본
setLayout(new FlowLayout());
add(button1);
//가장 마지막에 실행
setVisible(true);
}
private void addEventListener() {
button1.addActionListener(this);
}
/*
운영체제와 약속된 추상 메서드를 오버라이드 한다.
이는 이벤트가 발생되면 이 메서드를 수행하도록 하기 위해서다.
⭐콜백
callback
직접 수행하는 것이 아니라
미리 정해져 있는 정보(객체)를 받을 수 있게 하는 것
💀단, 어떤 컴포넌트가 이벤트를 실행시킬 것인지
먼저 등록해둬야 한다.
*/
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("actionPerformed() 메서드 호출");
System.out.println(e.toString());
}
//main
public static void main(String[] args) {
ColorChangeFrame colorChangeFrame = new ColorChangeFrame();
}//end of main
}//end of class


모든 수식을 생성자에 때려박을 수도 있다.
특정부분을 분리해서 짜두면
나중에 고칠때 편할 수 있다.
addEventListener
이 메서드의 역할은
이벤트 리스너만을 등록 처리하는 것이다.
예제2) 두개의 버튼을 다르게 인식하도록 코드를 짜봤다.
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
⭐구조
상속 JFrame/ 구현 ActionListener
멤버변수
JButton
JPanel
생성자 (initData, setInitLayout, addEventListener)
메소드
initData (컴포넌트 정의)
setInitLayout (디자인)
addEventListener (상호작용)
오버라이드
actionPerformed
메인코드
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
본문중 구현된 actionPerformed 메서드의 매개변수 e를 통해 출력값이나 주소값을 구할 수 있다.
출력값을 비교하도록 하드코딩할 수도 있지만
주소값을 비교하는 편이 깔끔할 수 있다.
주소값을 구하려면
e.getSource를
JButton으로
다운캐스팅 해야 한다.
다운캐스팅은
부모 클래스 타입을
자식 클래스 타입으로 변환하는 것이다.
JButton selectedButton = (JButton)e.getSource();


package _swing2;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 4.29
* 버튼을 눌러 색깔을 바꿔보자
*/
public class ColarChangeFrame2 extends JFrame implements ActionListener {
//member
private JButton button1;
private JButton button2;
private JPanel panel1;
//cons
public ColarChangeFrame2() {
initData();
setInitLayout();
addEventListener();
}
//meth
private void initData() {
setSize(500,500);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
panel1 = new JPanel();
button1 = new JButton("검정");
button2 = new JButton("노랑");
}
private void setInitLayout() {
setLayout(new BorderLayout());
panel1.setBackground(Color.YELLOW);
add(panel1, BorderLayout.CENTER);
add(button1, BorderLayout.NORTH);
add(button2, BorderLayout.SOUTH);
//젤 마지막
setVisible(true);
}
/*
모든 수식을 생성자에 때려박을 수도 있다.
특정부분을 분리해서 짜두면
나중에 고칠때 편할 수 있다.
addEventListener
이 메서드의 역할은
이벤트 리스너만을 등록 처리하는 것이다.
*/
private void addEventListener() {
button1.addActionListener(this); // 다형성
button2.addActionListener(this);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getSource());
/*
e.getSource를
JButton으로 다운캐스팅
*/
JButton selectedButton = (JButton)e.getSource();
System.out.println(selectedButton);
System.out.println(selectedButton.getText());
//같은 객체의 주소값을 비교
if (selectedButton == button1) {
panel1.setBackground(Color.BLACK);
//같은 객체의 문자열을 비교
} else if (selectedButton.getText().equals(button2.getText())) {
panel1.setBackground(Color.YELLOW);
}
}
//main
public static void main(String[] args) {
ColarChangeFrame2 colarChangeFrame2 = new ColarChangeFrame2();
}//end of main
}//end of class


예제3) 배경색을 바꿔주는 7개 버튼 넣어보기
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
⭐구조
상속 JFrame/ 구현 ActionListener
멤버변수
JButton
생성자 (initData, setInitLayout, addEventListener)
메소드
initData (컴포넌트 정의)
setInitLayout (디자인)
addEventListener (상호작용)
오버라이드
actionPerformed
메인코드
----- ----- ----- ----- ----- ----- ----- ----- ----- -----
👍7개의 버튼을 원하는 위치에 배치하려면
setLayout의 배치관리자를
BorderLayout(동서남북중 5방배치) 나
FlowLayout(수평/수직배치) 보다는
null값을 줘서
수동으로 배치하는게 더 효과적일 수 있다.
이렇게 하면 컴포넌트들의 좌표, 크기 등도 수동으로 입력해줘야 한다.
👍 또한 버튼이 많은 만큼 for 반복문을 활용해서 코드 수를 줄여본다.
👍 한편 JFrame 의 프레임을 직접 수정하려면
getContentPane()
이라는 구문을 활용해야 한다.
package _my._swing;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/**
* 4.29
* 무지개버튼 만들어보기
*/
public class Rainbow extends JFrame implements ActionListener {
//member
private JButton[] buttons = new JButton[7];
private String[] colors = {"빨","주","노","초","파","남","보"};
//constructor
public Rainbow() {
initData();
setInitLayout();
addEventListener();
}
//method
private void initData() {
setSize(365,350);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setResizable(false);
for (int i = 0; i < buttons.length; i++) {
buttons[i] = new JButton(colors[i]);
}
}
private void setInitLayout() {
setLayout(null);
for (int i = 0; i < buttons.length; i++) {
buttons[i].setLocation(i*50, 0);
buttons[i].setSize(50, 50);
add(buttons[i]);
}
//마지막
setVisible(true);
}
private void addEventListener() {
for (int i = 0; i < buttons.length; i++) {
buttons[i].addActionListener(this);
}
}
@Override
public void actionPerformed(ActionEvent e) {
JButton selecB = (JButton)e.getSource();
if (selecB == buttons[0]) {
getContentPane().setBackground(Color.RED);
} else if (selecB == buttons[1]) {
getContentPane().setBackground(Color.ORANGE);
} else if (selecB == buttons[2]) {
getContentPane().setBackground(Color.YELLOW);
} else if (selecB == buttons[3]) {
getContentPane().setBackground(Color.GREEN);
} else if (selecB == buttons[4]) {
getContentPane().setBackground(Color.BLUE);
} else if (selecB == buttons[5]) {
getContentPane().setBackground(new Color(8,37,103));
} else if (selecB == buttons[6]) {
getContentPane().setBackground(new Color(109,0,255));
}
}
//main
public static void main(String[] args) {
new Rainbow();
}//end of main
}//end of class





'Java' 카테고리의 다른 글
| Swing 예제, 로또번호 만들기 (0) | 2025.04.30 |
|---|---|
| Swing예제, KeyListener로 특정 키 값 인식 (0) | 2025.04.29 |
| Swing 예제, JLabel로 이미지 팝업하기 (0) | 2025.04.29 |
| 스윙 Swing, 자바에서 GUI를 만들어주는 도구 (0) | 2025.04.28 |
| 내부 클래스 Inner Class, 논리적으로 응집력 있는 클래스 설계 (1) | 2025.04.25 |