본문 바로가기

공부/컴퓨터

Listener을 등록하는 방법...

반응형
안녕하세요.
찬 입니다.



몇일전에 애들이랑 공부한 부분이군요 ^_^


우선 클래스내에 무명함수로 만들때에는.. 주로 ActionListener()에서
actionPerformed 를 구현할때쓰죠 ^_^



ActionListener 같은 경우는 actionPerformed 라는 메소드만 구현하면 되기 때문에..
주로 내부의 익명(무명)클래스에서 함수를 바로 정의해서 쓰더군요 ^_^



JButton loginBotton = new JButton("LOGIN");



loginButton.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e) {
      sm.sendLogin(id.getText() , new String( pass.getPassword()));
      frame.setContentPane(afterLoginPanel);
   }
});





만약 메소드가 많은 리스너를 등록하려고 한다면.. 익명의 내부 클래스를 쓰는것은,
좀 좋지 않은 방법이라 생각됩니다. ( 개인적인 생각입니다. )


하나의 메소드만 있으면 위의 방법은 그리 귀찮지 않게.. 구현할수 있습니다.



문제는.. KeyListener를 등록하려고 하면.. 세개의 메소드 모두 구현해 주어야 합니다.
KeyListener 같은 경우는 keyPressed() , keyReleased(), keyTyped() 메소드를 전부,
구현해 주어야만.. 되겠죠..



keyPressed() 액션에만 관심이 있는데.. 나머지 두개를 모두.. 구현해 주어야 합니다.

정확한 예는 아니지만.. 한번 해 본다면..




JTextField id = new JTextField(20);



id.addKeyListener( new KeyListener() {
public void keyPressed(KeyEvent e) {
  System.out.println("키가 눌려 졌습니다.");
}
public void keyReleased(KeyEvent arg0) {
  // 인터페이스를 전부 완성해 주어야 한다.
}

public void keyTyped(KeyEvent arg0) {
  // 인터페이스를 전부 완성해 주어야 한다.
}
  
});


이렇게 하면 -_- 무지 귀찮겠죠?



그럴때를 위해서.. 어댑터 클래스들이 존재 합니다.



KeyAdapter 라는 클래스가 존재하는데.. 이 클래스는 이미..
위의 메소드 세개가 전부다 정의 되어 있습니다.



그래서 관심있는 메소드만 재정의 방식을 통해서 사용하면...
나머지 관심없는것들은 일일이 저런 방식으로 구현하지 않아도 되겠죠? ^_^?



아래와 같이 쓰면 될것 같군요.



id.addKeyListener( new KeyAdapter() {
// 관심있는 액션만 등록해서 쓰자.. 나머지는 다 구현되어 있으니...
public void keyPressed(KeyEvent e) {
  System.out.println("키가 눌려 졌습니다.");
}
});





그리고.. 내부클래스를 이용해서 만들면.. 좋은점이 있습니다.
현재 객체의 참조들을 모두 사용할수 있다는것입니다.



위의 예를 본다면 ... 외부클래스에서 사용되는 id JTextField를..

내부 클래스 안에서 바로 쓸수 있죠.
아래와 같이 할수 있죠...


id.addKeyListener( new KeyAdapter() {
// 관심있는 액션만 등록해서 쓰자.. 나머지는 다 구현되어 있으니...
public void keyPressed(KeyEvent e) {
  id.setText("키보드를 눌렀습니다.");
}
});





하지만.. 그것을 처리하는 클래스를 아예 따로 만들어서 처리 하게 된다면?
id를 매개인자 등으로 넘겨 주어야만.. id에 접근이 가능하겠죠?

내부클래스를 쓸때의 장점은 이런점이 있지 않을까 싶습니다. ^_^;





물론 님께서 말씀하신 방법중에 아래와 같은 방법으로도.. 쓸수 있습니다 ^_^
클래스 자체에.. 액션메소드들을 정의해서 쓰는거죠..


public class Test implements ActionListener {

    JButton button;

    Test() {
        button = new JButton("버튼");
        button.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(e+" 이벤트 일어 나다");
    }

}


위와 같이 하면..
버튼에 액션 리스너를 주는데.. 현재의 클래스가 ActionListener을 구현하고 있습니다.

그 구현하는 메소드가 바로 actionPerformed() 겠죠?


그러므로.. 현재.. 자신의 객체는... ActionListener 형으로 변환 될수 있습니다.

그래서 아래와 같이 액션 리스너를 등록 시킬수 있습니다.
button.addActionListener(this);




흐음.. ^_^



즐거운 하루 되세요~ ^_^
반응형