khstar

Java Swing Window Event (제목표시줄의 X 버튼등을 클릭할시 이벤트 수행) 본문

개발/JAVA

Java Swing Window Event (제목표시줄의 X 버튼등을 클릭할시 이벤트 수행)

khstar 2010. 7. 21. 11:12
반응형
Frame을 이용해서 윈도우 창을 만들더라고 종료버튼(제목표시줄 X 아이콘)을 누르더라도 종료가 되지 않는 것을 볼 수가 있습니다.

AWT 컴포넌트들은 단순히 눈에 보여지는 것이 기본이기 때문에 그 어떤 기능도 들어 있지 않다고 할 수 있습니다. 이 부분은 개발자가 java.awt.event 패키지를 이용해서 각 기능을 만들어줘야 합니다.

이것을 이벤트라고 하는데 각 컴포넌트들이 눌러지거나 어떤 조건을 성립하게 되면 특정 기능을 수행하도록 하기 때문입니다. 게임에서 특정 조건이 모아지면 일어나는 이벤트와 같은 의미입니다.

java.awt.event 패키지를 보게 되면 각종 이벤트리스너들이 있는 것을 확인 할 수 있습니다. 마우스, 키보드, 윈도우 등 각 컴포넌트에 맞게 적절히 선택해서 사용하면 되는 부분이므로 각 특징은 API 문서를 참고하시길 바라며, 인터페이스를 구현하는 방식으로 사용하도록 돼 있습니다.

그럼 Frame의 종료 이벤트를 삽입한 예제를 보도록 합시다.

import java.awt.*;
import java.awt.event.*;

class A extends Frame implements WindowListener{
 
        public A(String title){
                super(title);
                this.setSize(300,300);
                this.setLocation(300, 300);
                this.addWindowListener(this);
        }
 
        public static void main(String args[]){
                A a = new A("이벤트 예제");
                a.setVisible(true);
        }
 
        public void windowActivated(WindowEvent e) {}
        public void windowClosed(WindowEvent e) {}
        public void windowClosing(WindowEvent e) {
                System.exit(0);
        }
        public void windowDeactivated(WindowEvent e) {}
        public void windowDeiconified(WindowEvent e) {}
        public void windowIconified(WindowEvent e) {}
        public void windowOpened(WindowEvent e) {}
}


위 예제를 보면 기존의 코딩 방식부터가 약간 다른것을 확인해 볼 수 있습니다. 자바 프로그래밍을 하다 보면 위와 같이 Frame 클래스를 이용하게 되면 Frame 클래스를 이용해서 복잡하게 객체를 만들고 메소드를 객체로 부터 호출하는 것 보다는 상속을 통해서 자손 클래스가 부모 클래스의 기능을 모두 부여 받아 이용하는 것이 더 효율이 좋습니다.

그럼 이벤트에 관해서 이야기를 계속해 보도록 합시다. 위 예제에서 윈도우 창을 종료하기 위해서 WindowListener 인터페이스를 구현해서 windowClosing 메소드를 호출하도록 하고 있습니다. windowClosing 메소드를 사용하지 않고도 호출이 되는 이유가 궁금하실거라 생각됩니다. windowClosing 메소드는 직접 호출을 하는 것이 아니라 종료 버튼을 누르게 되면 자동으로 호출이 되는 메소드 이기 때문에 내용만 구현이 돼 있다면 언제든지 호출이 됩니다.

위 예제는 프로그램 자체를 종료 하도록 하는 예제 입니다. 만약 종료가 아닌 창만 사라지게 하고 싶다면 dispose 메소드를 이용하면 됩니다.(AWT를 확장한 Swing에서는 기본으로 dispose 메소드가 불러지도록 설정 돼 있습니다.)

그런데 여기서 잠시 소스를 조금 줄여보도록 하겠습니다. 위 소스를 보면 사용하지 않는 메소드 까지 일일이 오버라이딩 해야 하는 것이 상당히 번거롭고 불필요한 코딩까지 해야 하므로 효율이 떨어지는건 사실입니다. 그래서 이 WindowListener 인터페이스를 단순히 속빈 강정 처럼 구현을 해둔 WindowAdapter 클래스를 이용해 보도록 합시다.

import java.awt.*;
import java.awt.event.*;

class A extends Frame{
 
        public A(String title){
                super(title);
                this.setSize(300,300);
                this.setLocation(300, 300);
  
                this.addWindowListener(new WindowAdapter(){
                        public void windowClosing(WindowEvent e) { 
                                System.exit(0);
                        }
                });
        }
 
        public static void main(String args[]){
                A a = new A("이벤트 예제");
                a.setVisible(true);
        }
}


처음 예제와 비교해보면 상당히 간편한 것을 확인할 수 있습니다. 자바에서 Adapter이라는 것은 일종의 패턴이긴 하지만 간단하게 소개를 하도록 하겠습니다. 특히 이 어뎁터라는 것은 이벤트 처리에 상당히 유용합니다. 이벤트리스너 인터페이스들은 구현을하면서 사용하게 되면 사용하지 않는 메소드 까지 오버라이딩을 통해서 구현을 해야 하기 때문에 번거롭고 귀찮습니다. 그래서 어뎁터를 이용해서 그 효율을 좋게 만드는 것이죠. 호환성을 갖는다는 의미로도 생각하시면 됩니다.

예로 어뎁터라는 것은 220V를 12V로 변환해 준다고 생각을 하면 편리합니다. 주로 핸드폰 충전을 예로 들면 이해가 좀 되실거라 봅니다.(이 부분은 패턴 공부를 하시면 쉽게 이해 됩니다.)

그래서 어뎁터는 각 이벤트리스너 마다 존재합니다. 단, 이벤트리스너의 메소드가 2개 이상인 경우에만 존재합니다. 그리고 이를 무명클래스 방식으로 사용하면 굳이 상속이나 구현을 이용하지 않고도 필요한 메소드만 오버라이딩 해서 사용을 할 수 있는 것 입니다.

어떤 프로그램을 어떤 방식으로 코딩하느냐에 따라 사용법은 달라지겠지만 이벤트 처리는 어뎁터와 무명 클래스를 이용하면 상당히 편리하게 프로그래밍을 할 수 있습니다.

그리고 각종 이벤트리스너는 API문서를 통해서 익히도록 합시다. 어렵지 않은 부분이기 때문에 쉽게 각 컴포넌트에 쉽게 이벤트리스너들을 적용할 수 있을거라 봅니다.

감사합니다.
반응형
Comments