버튼 이벤트 처리기 만들기

--·2023년 1월 3일
0

  • 초기화면은 배경이 흰색입니다.
  • Yellow 버튼을 누르면 배경색이 노란색으로 바뀝니다.
  • Blue 버튼을 누르면 배경색에 파란색으로 바뀝니다.

코드

package EventEX;

import java.awt.Color;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;

public class EventEx extends JFrame{
	Container c; // 이번트 리스너에서 접근하기 위해 EventEX()생성자의 밖으로 꺼내어 클래스 내부에 있는 이벤트 리스너로 setBackground를 접근하였습니다.
	EventEx(){
		c = getContentPane(); // ContentPane을 생성해줍니다.
		c.setLayout(new FlowLayout()); // 배치 관리자는 FlowLayout으로 설정합니다.
		JButton w= new JButton("Yellow"); // White 버튼 생성
		JButton b= new JButton("Blue"); // Blue 버튼 생성
		w.addActionListener(new MyActionListener()); // 이벤트 리스너 객체 추가
		b.addActionListener(new MyActionListener()); // 이벤트 리스너 객체 추가
		
		c.add(w); // 컨테이너에 버튼을 추가합니다.
		c.add(b); // 컨테이너에 버튼을 추가합니다.
		
		setTitle("Color Button Event"); // 이름을 정해줍니다.
		setSize(300,200); // 크기를 정해줍니다.
		setVisible(true); // 보이게 해줍니다.
		// 메인 쓰레드가 종료될때 이벤트 쓰레드도 같이 종료되게 종료 코드를 넣어줍니다.
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		
	}
	
	public static void main(String[] args) {
		new EventEx(); // 이벤트 객체 생성
	}
	class MyActionListener implements ActionListener{ // 이벤트 리스너 클래스 ActionListener를 상속받는다.
		public void actionPerformed(ActionEvent e) { // 상위 클래스가 가지고 있는 actionPerformed를 구현합니다.
			JButton button= (JButton)e.getSource(); //버튼 소스를 인식하는 코드입니다. getSource는 상위 클래스의 객체기 때문에 다운캐스팅을 해주어야한다
			if(button.getText().equals("Blue")) { // 버튼의 Text가 Blue이면 ContentPane의 색을 BLUE로 바꿔줍니다.
				c.setBackground(Color.BLUE);
			}
			else { // 버튼의 Text가 Yellow이면 ContentPane의 색을 WHITE로 바꿔줍니다.
			c.setBackground(Color.yellow);
			}
		}
		
	}
}

어려웠던 점 / 배운 점

처음에 Container c; 참조 객체를 EventEx() 생성자 안에 넣었고 이벤트 리스너를
독립 클래스로 따로 정의하였습니다. 하지만 문제가 Container의 색을 바꿔주는 것
이였습니다. 그래서 Container의 색을 접근하려면 c참조 객체가 필요하였고 이것을
접근 하려면 Container c;를 EventEx()안에서가 아닌 밖에서 정의해주었고 리스너와
연결시키기 위해서 MyActionListener객체를 EventEx의 내부클래스에서 정의해주자
문제가 해결 되었습니다. 이런 방법도 있고 또 다른 방법으로는 무명클래스를 사용하
여 MyActionListener()객체를 생성할 때 밑에다가 바로 리스너 행동을 추가 해주면
서 선언을 할 수 있지만 보기에 좀 지저분해서 내부 클래스를 선택하였습니다.

문제를 해결하며 처음에 컨테이너를 생성해주고 컨테이너 안에 이벤트 리스너가 추가
된 버튼을 넣어주는 방식을 사용하였고 이벤트 리스너에서는 e.getSource를 사용하
여 버튼 소스를 인식하였습니다. 버튼 소스를 인식할 때 주의할 점은 getSource가
버튼일수도 있고, ContentPane일 수도 있고 뭔지 모르기 때문에 앞에 (JButton)을
추가하여 캐스팅을 해주어야 컴파일오류가 사라집니다.

0개의 댓글