새소식

Java

[JAVA] Swing GUI 기초(3) - 이벤트 리스너

  • -

 

자바의 이벤트 처리

이벤트는 마우스 클릭, 키 입력, 외부로부터의 데이터 수신 등 사용자의 입력을 다루는 것입니다. 이러한 이벤트를 자바에서 처리할 때 아래 리스트와 같은 프로세스를 거쳐서 진행됩니다.

  1. 사용자가 마우스로 JButton 컴포넌트를 클릭한다.
  2. 마우스 입력을 전달받은 자바 가상 기계이벤트 분배 스레드에게 마우스 클릭에 대한 정보를 보낸다.
  3. 이벤트 분배 스레드는 이벤트에 관한 정보를 담은 이벤트 객체를 생성한다.
  4. 이벤트 분배 스레드가 JButton에 연결된 이벤트 리스너를 찾아 호출한다 이때 이벤트 객체를 인자로 전달한다.

이벤트 리스너(Event Listener) 란?

위 프로세스에서 주의깊게 봐야 하는 것은 이벤트 리스너입니다. 이벤트를 처리하려면 개발자가 구현해야 하는 interface 로, 각 이벤트 리스너는 ActionEventListener(클릭), KeyListener(키보드 입력)처럼 이벤트의 종류에 따라 분류되어 있습니다. 인터페이스인 만큼 추상 메소드가 있는데요, 이 추상 메소드들이 이벤트가 발생했을 때 호출이 되어 다양한 작업을 수행할 수 있도록 도와줍니다.

 

이벤트 리스너 구현 및 컴포넌트에 add하기

리스너를 구현했다면 이 리스너를 쓸 컴포넌트에 add해주면 됩니다. 컴포넌트에 각 리스너마다 add함수가 있으니 그것을 이용해주세요

 

<예제 코드>

package swing;

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

public class EventListenerEx{

	public static void main(String[] args) {
		JFrame jf = new JFrame("Component Demo");
		Container c = jf.getContentPane();
		c.setLayout(new FlowLayout());
		JButton btn = new JButton("Click Me!");
		// btn 컴포넌트에 ActionListener를 구현한 클래스 추가하기
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(500, 300);
		jf.setVisible(true);
	}

}

// ActionListener를 구현한 MyActionLisenter
class MyActionListener implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent e) { // 매개변수로 ActionEvent가 오는 모습
		// TODO Auto-generated method stub
		System.out.println("버튼이 눌렸습니다.");
	}
	
}

 

실행 결과는 다음과 같습니다. 버튼을 누를 때 마다 콘솔 창에 '버튼이 눌렸습니다'가 프린트 됩니다.

 

 

익명 클래스를 이용한 리스너 설정

익명 클래스는 말 그대로 이름이 없는 클래스로 상속 받을 슈퍼클래스나 구현할 인터페이스를 이용하여 제작할 수 있습니다. 이것을 ActionListener 인터페이스를 구현하는 클래스를 만드는데에 이용해보자면 다음과 같습니다.

package swing;

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

public class EventListenerEx{

	public static void main(String[] args) {
		JFrame jf = new JFrame("Component Demo");
		Container c = jf.getContentPane();
		c.setLayout(new FlowLayout());
		JButton btn = new JButton("btn1 Click Me!");
		JButton btn2 = new JButton("btn2 Click Me!");
		// btn 컴포넌트에 ActionListener를 구현한 클래스 추가하기
		btn.addActionListener(new MyActionListener());
		c.add(btn);
		
		// btn2 컴포넌트에 익명 클래스 추가하기
		btn2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("익명 클래스로 구현한 리스너를 추가한 버튼");
			}
		});
		c.add(btn2);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jf.setSize(500, 300);
		jf.setVisible(true);
	}

}

// ActionListener를 구현한 MyActionLisenter
class MyActionListener implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent e) { // 매개변수로 ActionEvent가 오는 모습
		// TODO Auto-generated method stub
		System.out.println("버튼이 눌렸습니다.");
	}
	
}

 

이제 버튼2를 클릭하면 '익명 클래스로 구현한 리스너를 추가한 버튼'이라는 문구가 콘솔창에 뜨게됩니다.

 

 

'Java' 카테고리의 다른 글

[JAVA] 제네릭 클래스(Generic Class)  (1) 2023.12.17
[JAVA] Swing GUI 기초(2) - 컴포넌트  (0) 2023.11.28
[JAVA] Swing GUI 기초(1) - JFrame  (0) 2023.11.23
[Java] 업캐스팅과 다운캐스팅  (0) 2023.11.10
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.