2012년 9월 9일 일요일

스윙으로 원본창 만들기(JRootPane)



JRootContainer 클래스를 공부해 보도록 하겠다. 모든 스윙 컨테이너들은 JRootPane을 가지는데 JRootPane이라는 객체는 layeredpane과 glassPane으로 구성되어 있다. 그 중에서도 layeredpane은 contentPane과 optional menu bar를 가지고 있고 JRootPane의 틀안에서 보자면 JLayeredPane의 인스턴스인 layeredpane은 모든 컨테이너 자식들의 부모격 콤포넌트로 다층레이어로 이루어져 있어 여러 콤포넌트들이 내용을 담을수 있는 contentPane 위에 올수 있도록 만들어준다. JRootPane 틀안에서 JPanel의 인스턴스인 glassPane은 모든 콤포넌트들의 최상위에 위치하며 이것은 마우스의 이벤트나 콤포넌트 사이에서 dragging이나 drawing을 가능하게 만들어준다. 즉 마우스 동작의 반응여부를 컨트롤하거나 어떤 콤포넌트들의 위에서 그림을 그릴수 있다는 것이다. 기본적으로 glassPane은 보이지 않게 되어있다.


컨테이너들의 컨텐츠들은 사실 그것들과 관계된 content pane에 저장되는데 스윙 컨테이너에 바로 add( ) 메소드를 이용하지 않고 대신에 컨테이너의 content pane을 거쳐서 add하게 된다. 다시 말해, content pane을 거친다는 의미는 코드상으로 getContentPane( ) 메소드를 이용한 중간단계가 있다는 것을 의미한다.

이렇게 쓰면 컨테이너는 도대체 뭐냐고 하는 이들이 있을 것이다.^^ Root 한마디로 최상위 컨테이너들은 총 다섯가지가 있다. 나열해보면 JFrame, JDialog, JApplet, JWindow, JInternalFrame이 있는데 자바 애플리케이션 만들때 사용하는거라는건 다 알테고 JInternalFrame은 자바 애플리케이션 안에 여러개의 프레임을 만들때 필요하다. 다른 컨테이너들이야 이름지어진 뜻데로 생각하면 될테고 그전 강의들에서 필자가 다루어왔으니 다 알것이라 믿겠다.ㅎㅎ

컨테이너들은 JFrame, JDialog, JApplet, 별로 쓰이지 않아서 빼고 싶은 JWindow가 대표적인 컨테이너들이다. 그리고 light-weight 경량 컨테이너인 JInternalFrame이 있겠으나 이건 AWT 클래스를 계승하고 있지 않으므로 약간 동떨어진 삘을 받는다. 이해가 되지 않으면 그림을 살짝 들여다보면 이해가 될것이라 생각한다. 어차피 이번 강좌의 내용은 스윙의 구조도에 대한 기본적인 체계에 대한 설명이니 설령 어렵게 느껴지더라도 스윙을 많이 접하게 되면 이래서 되고 저래서 안되는구나하는 이치를 저절로 깨닫게된다. 한마디로 시간이 약이다.ㅎㅎ


하지만 필자가 누구더냐? 그런 이들을 위해 그냥 간단하고 심플한 예제 하나로 본 내용의 이치와 정석을 깨우치도록 해보겠다. 실행할 예제의 결과는 다음과 같다.


사실 말로만 끝내도 상관없으나 프레임처럼 최상위 컨테이너에 해당하는 contentPane은 JRootPane의 인스턴스 객체안에서 생성되므로 사실 정의할 필요가 없으나 JRootpane의 클래스 인스턴스를 직접적으로 정의하고 쓴다면 그에 필요한 컨테이너를 정의하여야 한다. 바로 그것이 아까 초반부에 얘기한 중간단계라는 것이다. 사실 자바의 JRootPane을 공부하면서 가장 어렵게 느껴지는 부분이 이것이므로 이에 대한 예제를 핵심코드라인 2줄로서 그 차이점을 명쾌하게 파헤쳐본 것이 아래의 예제라 하겠다.


예제를 보고 직접 해보면 무엇을 설명하고자 하는지 알게되리라 본다. 그럼 이로서 그동안 진행해온 스윙을 간략하게나마 이렇게 마무리하고 다음 시간부터는 새로운 주제와 내용으로 무장해서 여러분의 기대와 성원에 성심성의껏 부응해 보도록 하겠다. 그럼 좋은 하루~^^

댓글 없음:

댓글 쓰기