2008. 8. 23. 16:10

Part 6. AWT - II 컴포넌트의 이벤트 처리(1)

이벤트, 이벤트 소스, 이벤트 핸들러란?
이벤트(event) : 프로그램과 사용자간의 상호작용을 위해서 사용자가 키보드나 마우스 등의 장치를 통해서 응용 프로그램에 어떤 요구를 하는 사건을 말합니다.
이벤트 리스너(event listener) : 이벤트를 기다렸다가 이벤트가 발생하게 되면 전달되어오는 이벤트 소스 객체로 적당한 처리를 하게 되는 객체를 말합니다.
이벤트 소스(event source) : 버튼(Button)이나 스크롤바(Scrollbar)와 같이 이벤트가 발생한 컴포넌트 객체를 말합니다.

이벤트 처리 방법
1. 이벤트 패키지 임폴트 : import java.awt.event.*;
2. 처리할 이벤트에 대한 이벤트 리스너의 설계
public class ButtonListener implements ActionListener {
}
ActionListener는 이벤트 처리를 담당하는 이벤트 리스너 인터페이스
ButtonListener는 ActionListener 인터페이스를 구현하여 만든 이벤트 리스너 클래스
이벤트 리스너 클래스(ButtonListener)는 인터페이스를 구현한 것이므로 인터페이스 내부의 추상 메서드를 오버라이딩 해서 구현해야 한다.
ActionListener 인터페이스는 actionPerformed 메서드 한개만 추상 메서드로 가진다.
이 메서드는 버튼에 이벤트가 발생하면 호출되는 메서드이다.
3. 이벤트 리스너 객체를 생성한다.
4. 이벤트를 받아들인 컴포넌트 객체에 리스너를 등록한다.

아래는 레드,블루 버튼을 클릭하는 이벤트가 발생하면 배경이미지가 바뀌는 이벤트 처리
소스이다.
===================================================================================
package pack05;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
// FrameEx가 두가지 역할(프레임으로서, 이벤트처리객체로서)을 하도록
class FrameEx extends Frame implements ActionListener{
 Button redBtn, blueBtn ;
 // actionPerformed의 전달인자인 ActionEvent가 이벤트소스에 정보를 갖고 있다.
 public void actionPerformed(ActionEvent e){
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  if(e.getActionCommand().equals("빨간색")){
   setBackground(Color.RED);
  }
  else if(e.getActionCommand().equals("파란색")){
   setBackground(Color.BLUE);
  }
 }
 FrameEx(){
  // 배치관리자로 플로우 레이아웃 지정
  // 빨간색 버튼을 redBtn으로
  // 파란색 버튼을 blueBtn으로 생성
  // 프레임 크기를 300,200으로 설정
  // 눈에 보이도록 한다.
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트처리객체를 연결해 주어야 한다.
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(300,200);
  setVisible(true);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEx();
 }
}
===================================================================================
윈도우 창에 X버튼을 누르면 창이 닫히도록 하기(윈도우리스너 인터페이스로 구현)
package training;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
// [닫기]버튼이 눌리면 창이 닫히도록 WindowListener 인터페이스 상속 받음
class FrameEvent extends Frame implements ActionListener, WindowListener{
 public void windowActivated(WindowEvent arg0) {  
 }
 public void windowClosed(WindowEvent arg0) {
 }
 // [닫기]버튼이 눌러졌을 때 호출되는 메소드
 public void windowClosing(WindowEvent arg0) {
  dispose();
  System.exit(0);
 }
 public void windowDeactivated(WindowEvent arg0) {
 }
 public void windowDeiconified(WindowEvent arg0) {
 }
 public void windowIconified(WindowEvent arg0) {
 }
 public void windowOpened(WindowEvent arg0) {
 }
 public void actionPerformed(ActionEvent e) {
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  Object o=e.getSource();
  if(o==redBtn){
   setBackground(Color.RED);
  }
  else if(o==blueBtn){
   setBackground(Color.BLUE);
  }
 }
 // 클래스 내의 멤버(필드)로 버튼에 대한 레퍼런스 변수를 선언해야 한다.
 Button redBtn, blueBtn;
 FrameEvent(){
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트 처리 객체와 연결
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  // 이벤트 소스인 프레임과 이벤트 처리 객체와 연결
  this.addWindowListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(400,300);
  setVisible(true);
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameEvent();
 }
}
===================================================================================
윈도우 어댑터 클래스를 통한 구현
package pack01;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameEvent extends Frame implements ActionListener{
 public void actionPerformed(ActionEvent e) {
  System.out.println(e.getActionCommand()+"버튼이 눌림");
  Object o=e.getSource();
  if(o==redBtn){
   setBackground(Color.RED);
  }
  else if(o==blueBtn){
   setBackground(Color.BLUE);
  }
 }
 // 클래스 내의 멤버(필드)로 버튼에 대한 레퍼런스 변수를 선언해야 한다.
 Button redBtn, blueBtn;
 FrameEvent(){
  setLayout(new FlowLayout());
  redBtn=new Button("빨간색");
  blueBtn=new Button("파란색");
  // 이벤트 소스인 버튼과 이벤트 처리 객체와 연결
  redBtn.addActionListener(this);
  blueBtn.addActionListener(this);
  add(redBtn);
  add(blueBtn);
  setSize(400,300);
  setVisible(true);
  SubClass sc=new SubClass();
  addWindowListener(sc);
 }

 // 창이 닫히도록 하기 위해서 필요한 메소드 : WindowClosing();
 class SubClass extends WindowAdapter{
  public void windowClosing(WindowEvent e) {
   dispose(); // 창(프레임)을 소멸
   System.exit(0); // 프로세스 죽임
  }
 }
} // Frame 클래스의 끝
public class Ex01 {
 public static void main(String[] args) {
  new FrameEvent();
 }
}
===================================================================================
외부 클래스와 내부 클래스
package pack01;
class Outer{ // 외부클래스
 int data=100;
 class Inner{ // 내부클래스 : 외부클래스의 모든 멤버를 가져다 사용할 수 있다.
  int b=200;
  public void printData(){
   System.out.println(data);
  }
 } // inner 클래스의 끝
} // outer 클래스의 끝
public class Ex02 {
 public static void main(String[] args) {
 
 }
}
===================================================================================
package pack01;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameExit extends Frame{
 FrameExit(){
  setSize(400,300);
  setVisible(true);
  // 이벤트 소스와 이벤트 처리 객체와 연결되어야 함
  this.addWindowListener(
   // WindowAdapter를 슈퍼로 갖는 서브클래스 설계 시작
   new WindowAdapter() {
    @Override
    public void windowClosing(WindowEvent e) {
     System.out.println("WindowClosing 메소드 호출");
     dispose();
     System.exit(0);
    }    
   } // 클래스 설계 끝
  ); // addWindowListener 메소드 호출
 }

}
public class Ex03 {
 public static void main(String[] args) {
  new FrameExit();
 }
}
===================================================================================