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)을
추가하여 캐스팅을 해주어야 컴파일오류가 사라집니다.