본문 바로가기

Java

Swing예제, ActionListener로 버튼 상호작용

⭐액션리스너 인터페이스
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();

매개변수 e의 출력값을 문자열과 직접 비교하는 방법

 

e.getSource 를 JButton으로 다운캐스팅하여 주소값을 비교하는 방법

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

button1을 누르자 panel1의 배경색이 검은색으로 바뀌었다.
button2을 누르자 panel1의 배경색이 노란색으로 바뀌었다.

 

 

예제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

초기화면
빨강 버튼을 눌렀을때
노랑 버튼을 눌렀을때
파랑 버튼을 눌렀을때
보라 버튼을 눌렀을때