Java

2024.04.29 Swing - 5 (이벤트 리스너)

정훈5 2024. 4. 29. 14:39

implements 사용

package ch05;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class ColorChangeFrame extends JFrame implements ActionListener {
	
	// 이벤트 리스너에 대한 개념을 이해하자.
	
	private JButton button1;
	
	public ColorChangeFrame() {
		initData();
		setInitLayou();
		addEventListener();
	}
	
	private void initData() {
		setTitle("Swing5");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button1 = new JButton("button1");
	}
	private void setInitLayou() {
		setLayout(new FlowLayout());
		add(button1);
		setVisible(true);
	}
	private void addEventListener() {
		button1.addActionListener(this);
		
	}
	
	// 코드 테스트
	public static void main(String[] args) {
		new ColorChangeFrame();
		
	} // end of main
	
	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("actionPerformed 메서드 호출() " +e);
	}

} // end of class

implements 사용

package ch05;

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
// 이벤트 리스너를 사용하는 방법
// 1. implements ActionListener 사용 하는 방법 
// ActionListener --> 운영 체제가 제어하는 이벤트를 등록할 수 있다.

public class ColorChangeFrame extends JFrame implements ActionListener {

	// 이벤트 리스너에 대한 개념을 이해하자.

	private JButton button1;

	public ColorChangeFrame() {
		initData();
		setInitLayou();
		addEventListener();
	}

	private void initData() {
		setTitle("Swing5");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		button1 = new JButton("button1");
	}

	private void setInitLayou() {
		setLayout(new FlowLayout());
		add(button1);
		setVisible(true);
	}

	private void addEventListener() {
		// button1이 눌러지는지 계속 이벤트를 지켜 보고 있어
		// 이벤트 등록
		// this가 사용되는 이유 인터페이스 implements ActionListener로 인해 this가 사용된다.
		button1.addActionListener(this);

	}

	// 코드 테스트
	public static void main(String[] args) {
		new ColorChangeFrame();

	} // end of main
		// 약속 되어 있던 추상 메서드를 오버라이드 했다.
		// 이벤트가 발생 되면 이 메서드를 수행해 약속 되어 있음
		// 단, 어떤 컴포넌트가 이벤트가 할당 되었는지 등록을 먼저 해주어야 한다.

	@Override
	public void actionPerformed(ActionEvent e) {
		// 매개변수 e
		System.out.println("actionPerformed 메서드 호출() ");
		System.out.println(e.toString());
	}

} // end of class

 


2번째 방법 implement 없이

package ch05;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class ColorChangeFrame2 extends JFrame {

	private JPanel panel;
	private JButton button1;
	private JButton button2;

	public ColorChangeFrame2() {
		initData();
		setInitLayout();
		addEventListener();
	}

	private void initData() {

		setTitle("Swing 5");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout()); // BorderLayout
		panel = new JPanel();
		panel.setBackground(Color.yellow);
		button1 = new JButton("click1");
	}

	private void setInitLayout() {
		add(button1, BorderLayout.NORTH);
		add(panel, BorderLayout.CENTER);
		setVisible(true);
	}

	private void addEventListener() {
		// 이벤트 리스너를 구현하는 두번째 방법
		button1.addActionListener(new ActionListener() {
			// 인터페이스는 new를 사용하지 못하기 때문에 구현 클래스로 만들었다.

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("button1 이 눌러졌어요.");
			}
		});
	}

	// 코드 테스트
	public static void main(String[] args) {
		new ColorChangeFrame2();
	}

}

implements 사용 (풀어봄)

package ch05;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class ColorChangeFrame2 extends JFrame implements ActionListener {

	private JPanel panel;
	private JButton button1;
	private JButton button2;

	public ColorChangeFrame2() {
		initData();
		setInitLayout();
		addEventListener();
	}

	private void initData() {

		setTitle("Swing 5");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout()); // BorderLayout
		panel = new JPanel();
		panel.setBackground(Color.yellow);

		button1 = new JButton("click1");
		button2 = new JButton("click2");
	}

	private void setInitLayout() {
		add(button1, BorderLayout.NORTH);
		add(button2, BorderLayout.SOUTH);
		add(panel, BorderLayout.CENTER);
		setVisible(true);
	}

	// 이 메서드에 책임은 이벤트 리스너만 등록
	private void addEventListener() {
		button1.addActionListener(this);
		button2.addActionListener(this);
	}

	// 오버라이드 : 이벤트가 일어나면 호출 되어지는 메서드
	@Override
	public void actionPerformed(ActionEvent e) {

		Object object = e.getSource();

		JButton selectedButton = (JButton) e.getSource();

		if (object == button1) {
			System.out.println("버튼1 ");
			panel.setBackground(Color.black);
		} else if (object == button2) {
			System.out.println("버튼2 ");
			panel.setBackground(Color.yellow);
		}

		// System.out.println(object);
		// System.out.println(button1);
		// System.out.println(button2);
		// System.out.println(e.getSource().toString());
	}

	// 코드 테스트
	public static void main(String[] args) {
		new ColorChangeFrame2();
	}

}

 

 

(풀이)

 

package ch05;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;

public class ColorChangeFrame2 extends JFrame implements ActionListener {

	private JPanel panel;
	private JButton button1;
	private JButton button2;

	public ColorChangeFrame2() {
		initData();
		setInitLayout();
		addEventListener();
	}

	private void initData() {

		setTitle("Swing 5");
		setSize(500, 500);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLayout(new BorderLayout()); // BorderLayout
		panel = new JPanel();
		panel.setBackground(Color.yellow);

		button1 = new JButton("click1");
		button2 = new JButton("click2");
	}

	private void setInitLayout() {
		add(button1, BorderLayout.NORTH);
		add(button2, BorderLayout.SOUTH);
		add(panel, BorderLayout.CENTER);
		setVisible(true);
	}

	// 이 메서드에 책임은 이벤트 리스너만 등록
	private void addEventListener() {
		button1.addActionListener(this);
		button2.addActionListener(this);
	}

	// 콜백 메서드
	// ex) 알람예약을 4시에 맞춰놓고 4시에 집에갈 예정이다.
	// 시간이 지나 4시가 되면 알람이 울려서 집에간다.

	// 콜백 메서드이다.
	// 오버라이드 : 이벤트가 일어나면 호출 되어지는 메서드
	@Override
	public void actionPerformed(ActionEvent e) {

		Object object = e.getSource();

		JButton selectedButton = (JButton) e.getSource();

		if (object == button1) {
			System.out.println("버튼1 ");
			panel.setBackground(Color.black);
		} else if (object == button2) {
			System.out.println("버튼2 ");
			panel.setBackground(Color.yellow);
		}

		// System.out.println(object);
		// System.out.println(button1);
		// System.out.println(button2);
		// System.out.println(e.getSource().toString());
	}

	// 코드 테스트
	public static void main(String[] args) {
		new ColorChangeFrame2();
	}

}

도전 문제

직접 풀어보기

package ch05;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class swing5_ extends JFrame implements ActionListener {
	// 버튼
	private JButton button1;
	private JButton button2;

	// 패널
	private JPanel panel1;
	private JPanel panel2;

	public swing5_() {
		initData();
		setInitLayout();
		addEventListener();
	} // 생성자

	private void initData() {

		setTitle("Swing5_ 도전연습");
		setSize(600, 400);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		panel1 = new JPanel();
		panel1.setBackground(Color.blue);

		panel2 = new JPanel();
		panel2.setBackground(Color.green);

		button1 = new JButton("button1");
		button2 = new JButton("button2");
	}

	private void setInitLayout() {
		// 루트 패널 --> BorderLayout
		add(panel1, BorderLayout.CENTER);
		add(panel2, BorderLayout.SOUTH);

		panel2.add(button1);

		panel2.add(button2);

		setVisible(true);
	}

	public void addEventListener() {

		button1.addActionListener(this);
		button2.addActionListener(this);

	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object object = e.getSource();

		if (object == button1) {
			panel1.setBackground(Color.black);
		} else if (object == button2) {
			panel1.setBackground(Color.yellow);
		}

	}

	public static void main(String[] args) {
		new swing5_();
	}

}