2008. 8. 28. 14:18

Part 6. AWT - IV 입력관련 이벤트 처리

입력 관련 이벤트 처리에서 인터페이스의 구현과 Adapter 클래스의 구현을 알아보도록 합니다. 아래는 샘플 코드입니다.
입력은 KeyEvent와 MouseEvent로 나누어 볼 수 있습니다.
===================================================================================
package pack02;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 FrameTest(){
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
KeyListener 인터페이스를 통한 구현
인터페이스를 implements 하므로 인터페이스의 모든 추상메소드를 오버라이딩 해야 한다.
===================================================================================
package pack01;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
// 이벤트 처리를 위해서 이벤트 소스를 포함한 클래스를 이벤트 처리 객체로 만들어 준다.
class FrameTest extends Frame implements KeyListener{
 public void keyPressed(KeyEvent e) {
  ta.append(e.getKeyChar()+"가 눌림\n");
  //ta.append((String)e.getKeyChar());
  // 소스가 에러를 일으키는 이유 : 기본형 char를 String로 캐스팅 하지 못한다.
 }
 public void keyReleased(KeyEvent e) {
 }
 public void keyTyped(KeyEvent e) {
 }
 TextField txt; // 이벤트 소스
 TextArea ta;
 FrameTest(){
  add(txt=new TextField(20), BorderLayout.NORTH);
  // 이벤트 소스와 이벤트 처리 객체를 연결
  txt.addKeyListener(this);
  add(ta=new TextArea(5,2), BorderLayout.CENTER);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
KeyAdapter 클래스를 통한 구현
어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리 하기
클래스를 불러오므로 원하는 메소드만 오버라이딩 하면 된다.
===================================================================================
package pack02;
import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 TextField txt;
 TextArea ta;
 FrameTest(){
  add(txt=new TextField(20), BorderLayout.NORTH);
  // 객체 생성하면서 클래스 설계 - 무명 클래스
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  txt.addKeyListener(
    new KeyAdapter(){
     @Override
     public void keyPressed(KeyEvent e) {
      ta.append(e.getKeyChar()+"가 눌림\n");
     }    
    }
  );
  add(ta=new TextArea(5,2), BorderLayout.CENTER);
  setSize(300,200);
  setVisible(true);  
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseListener 인터페이스를 통한 구형 - 마우스를 클릭하면 점 이동하기
===================================================================================
package pack03;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements MouseListener{
 public void mouseClicked(MouseEvent e) {
  x=e.getX(); y=e.getY();
  repaint();
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 int x=10, y=100;
 @Override
 // 이벤트에 의해서 호출되는 메서드
 public void paint(Graphics g) {
  g.setColor(new Color(250,0,250));
  g.fillOval(x, y, 20, 20);
 }
 FrameTest(){
  addMouseListener(this);
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseAdapter 클래스를 통한 구형 - 마우스를 클릭하면 점 이동하기
===================================================================================
package pack04;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 int x=10, y=100;
 @Override
 public void paint(Graphics g) {
  g.setColor(new Color(250,0,250));
  g.fillOval(x, y, 20, 20);
 }
 FrameTest(){
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  addMouseListener(new MouseAdapter(){
   @Override
   public void mouseClicked(MouseEvent e) {
    x=e.getX(); y=e.getY();
    repaint();
   }  
  }
  );
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseMotionListener 인터페이스를 통한 구현 - 드래그 시, 점 이동
===================================================================================
package pack05;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame implements MouseMotionListener{
 public void mouseDragged(MouseEvent e) {
  x=e.getX(); y=e.getY();
  repaint();
 }
 public void mouseMoved(MouseEvent e) {
 }
 int x=10, y=50;
 @Override
 public void paint(Graphics g) {
  addMouseMotionListener(this);
  g.setColor(Color.RED);
  g.fillOval(x,y,20,20);
 }
 FrameTest(){
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================
MouseMotionAdapter 클래스를 통한 구현 - 드래그 시, 점 이동
===================================================================================
package pack06;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
class FrameTest extends Frame{
 int x=10, y=50;
 @Override
 public void paint(Graphics g) {
  g.setColor(Color.RED);
  g.fillOval(x,y,20,20);
 }
 FrameTest(){
  // 어댑터 클래스를 내부 무명객체로 생성하여 이벤트 처리해보기
  addMouseMotionListener(new MouseMotionAdapter(){
   @Override
   public void mouseDragged(MouseEvent e) {
    x=e.getX(); y=e.getY();
    repaint();
   }  
  }
  );
  setSize(300,200);
  setVisible(true);
  addWindowListener(new WindowAdapter(){
   @Override
   public void windowClosing(WindowEvent arg0) {
    dispose();
    System.exit(0);
   }      
  }
  );
 }
}
public class Ex01 {
 public static void main(String[] args) {
  new FrameTest();
 }
}
===================================================================================