Files
java-examples/docs/swing/ActionListener.md

6.8 KiB

ActionListener와 ActionCommand 사용법

ActionListener는 버튼 클릭, 메뉴 항목 선택 등 사용자 입력에 대한 동작을 처리하는 인터페이스입니다.
ActionCommand는 특정 이벤트를 식별하는 문자열로, ActionListener가 어떤 동작을 수행해야 하는지 구분하는 데 사용됩니다.


1. ActionListener 기본 사용법

ActionListener를 사용하려면 ActionListener 인터페이스를 구현한 후 actionPerformed() 메서드를 오버라이드해야 합니다.

(1) 버튼 클릭 이벤트 처리 예제

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ActionListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("ActionListener Example");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();

        JButton button = new JButton("클릭하세요");

        // ActionListener 추가
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null, "버튼이 클릭되었습니다!");
            }
        });

        panel.add(button);
        frame.add(panel);
        frame.setVisible(true);
    }
}

설명

  1. JButton을 생성하고 "클릭하세요" 라벨을 설정.
  2. button.addActionListener()를 사용하여 ActionListener 추가.
  3. 버튼을 클릭하면 actionPerformed()가 호출되어 메시지 창이 표시됨.

2. ActionCommand 활용하기

기본적으로 버튼의 텍스트가 ActionCommand로 설정되지만, 직접 지정할 수도 있습니다.

(1) 여러 버튼을 구분하는 예제

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ActionCommandExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("ActionCommand Example");
        frame.setSize(400, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new FlowLayout());

        JButton btn1 = new JButton("버튼 1");
        JButton btn2 = new JButton("버튼 2");

        // ActionCommand 설정
        btn1.setActionCommand("BUTTON_ONE");
        btn2.setActionCommand("BUTTON_TWO");

        // 공통 ActionListener
        ActionListener listener = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String command = e.getActionCommand();
                if ("BUTTON_ONE".equals(command)) {
                    JOptionPane.showMessageDialog(null, "버튼 1이 클릭됨!");
                } else if ("BUTTON_TWO".equals(command)) {
                    JOptionPane.showMessageDialog(null, "버튼 2가 클릭됨!");
                }
            }
        };

        btn1.addActionListener(listener);
        btn2.addActionListener(listener);

        frame.add(btn1);
        frame.add(btn2);
        frame.setVisible(true);
    }
}

설명

  1. 두 개의 버튼(btn1, btn2)을 생성.
  2. setActionCommand("BUTTON_ONE")setActionCommand("BUTTON_TWO")로 명령어 설정.
  3. 하나의 ActionListener 에서 e.getActionCommand()를 사용하여 어떤 버튼이 눌렸는지 판별.

3. 별도의 ActionListener 클래스로 분리하기

코드를 깔끔하게 유지하려면 ActionListener를 별도의 클래스로 분리하는 것이 좋습니다.

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class MyActionListener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        JOptionPane.showMessageDialog(null, "이벤트가 발생했습니다! (" + e.getActionCommand() + ")");
    }
}

public class SeparateActionListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Separate ActionListener Example");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();

        JButton button = new JButton("클릭");
        button.setActionCommand("CLICK_BUTTON");

        // 별도의 클래스 사용
        button.addActionListener(new MyActionListener());

        panel.add(button);
        frame.add(panel);
        frame.setVisible(true);
    }
}

설명

  • MyActionListener 클래스를 만들어 ActionListener를 구현.
  • JButtonMyActionListener를 추가.
  • 클릭하면 "이벤트가 발생했습니다! (CLICK_BUTTON)" 메시지를 표시.

4. Lambda 표현식 사용

Java 8 이상에서는 람다를 사용하여 ActionListener를 더 간결하게 작성할 수 있습니다.

import javax.swing.*;

public class LambdaActionListenerExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("Lambda ActionListener");
        frame.setSize(300, 200);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();

        JButton button = new JButton("눌러보세요");

        // Lambda 표현식 사용
        button.addActionListener(e -> JOptionPane.showMessageDialog(null, "람다식으로 처리된 이벤트!"));

        panel.add(button);
        frame.add(panel);
        frame.setVisible(true);
    }
}

설명

  • ActionListener를 람다 표현식(e -> { })으로 간단하게 구현.
  • 코드가 더 짧고 가독성이 좋아짐.

5. 총정리

개념 설명
ActionListener 버튼, 메뉴 항목 등의 액션 이벤트를 처리하는 인터페이스
actionPerformed(ActionEvent e) 버튼 클릭 등 액션이 발생하면 호출됨
setActionCommand(String command) 특정 동작을 식별하기 위한 명령어 설정
getActionCommand() 이벤트 발생 시 설정된 ActionCommand 값 가져오기
구현 방식 - 익명 클래스 (new ActionListener() {}) 사용
- 별도 클래스 구현
- 람다 표현식 (e -> { }) 사용

6. 어떤 방식을 사용할까?

  • 버튼 수가 적다면?익명 클래스 또는 람다 표현식
  • 여러 개의 버튼을 한 곳에서 처리해야 한다면?ActionCommand 활용
  • 큰 프로젝트에서 여러 UI 요소가 같은 이벤트를 공유해야 한다면?별도 클래스ActionListener 분리

위 내용을 이해하면 버튼 클릭뿐만 아니라 메뉴 항목 선택, 키보드 단축키 처리 등 다양한 Swing 이벤트 처리에 활용할 수 있습니다.