프로그래밍[Univ]/Swing Basic

[Swing] 어댑터 클래스(Adapter Class)

Cloud Travel 2011. 9. 14. 09:50
 - 리스너 인터페이스를 사용하여 이벤트 리스너를 구현할 시 인터페이스가 제공하는 모든 메소드를
   구현해야하는 부담을 줄여주기 위해 생긴 클래스
- 인터페이스의 모든 메소드가 단순 리턴하게 구현 되있는 클래스
- 메소드가 1개인 리스너 인터페이스는 제공해 주지 않는다.
   ( Action. Item. Text. Adjustment )

ex) class KeyAdapter implements KeyListener{
        public void KeyPressed(keyEvent e){}
        public void KeyReleased(keyEvent e){}
        public void KeyType(keyEvent e){}
     }

위는 어뎁터 클래스중 하나의 클래스로 KeyListener의 어댑터 클래스이다.

이번엔 어뎁터 클래스를 사용한 코드예를 보자!!!
리스너쪽에 한정된 기술이므로 리스너가 구현 된 쪽만 살펴 보도록 한다.
다음 클래스는 마우스리스너를 상속받아 구현된 리스너이다.

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class MyMouseListener implements MouseListener{

    public void mouseClicked(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        if(btn.getText().equals("Mouse Event Test Button")){
            btn.setText("마우스 이벤트 테스트 버튼");
        }else{
            btn.setText("Mouse Event Test Button");
        }
    }

    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
    }

    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
    }

    public void mouseEntered(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        btn.setBackground(Color.BLUE);
    }

    public void mouseExited(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        btn.setBackground(Color.YELLOW);
    }
}

이것을 어뎁터 클래스를 사용하여 변경해보겠다.

import java.awt.event.*;
import javax.swing.*;
import java.awt.*;

public class MyMouseListener extends MouseAdapter{

    public void mouseClicked(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        if(btn.getText().equals("Mouse Event Test Button")){
            btn.setText("마우스 이벤트 테스트 버튼");
        }else{
            btn.setText("Mouse Event Test Button");
        }
    }
   
    public void mouseEntered(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        btn.setBackground(Color.BLUE);
    }

    public void mouseExited(MouseEvent e) {
        JButton btn = (JButton)e.getSource();
       
        btn.setBackground(Color.YELLOW);
    }
}

소스코드가 딱히 변한 것은 없지만 사용자가 사용안하는 메소드에 대해서 구현을 안해도
자동으로 한 것 처럼 인식하기 시작한다. 이는 어뎁터 클래스에 이미 구현이 다 되 있기 때문이다.

만약 어댑터클래스를 사용하지 않고, 인터페이스로 구현햇을시
모든 메소드를 구현하지 않으면 다음과 같은 오류가 발생한다.
이 오류는 항상뜨는 것은 아니고, 구현되지 않는 동작에 대해서 행동을 취할 시 발생한다.

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problem:
    The type MyMouseListener must implement the inherited abstract method MouseListener.mousePressed(MouseEvent)