March 26th, 2008
PopupFactory 이야기

popup

또 Swing 이야기.
툴팁 이야기하다가 말고 윈도우 목록 얻어오는 이야기를 하더니 이제는 팝업이야기란다.

팝업은 JPopupMenu에서도 사용되지만 JTooltip의 부모가 되기도 하기 때문에 다 관련이 있다.

PopupFactory는 말 그대로 Popup을 만들어 준다. 팝업은 다른 컴포넌트들 Z-order 상으로 위에 무언가(메뉴, 툴팁)를 보여줄 수 있는 Container이다.
PopupFactory의 API는 과하다 싶을 정도로 간단하다. 실질적으로 다음 하나의 메소드 밖에 없다.

public Popup getPopup(Component owner, Component content, int x, int y)

버튼에 툴팁이 보여지는 경우는 예로 들면 owner가 button, content가 JTooltip이 된다. 물론 이 메소드는 자동으로 호출되기만 하지 애플리케이션 개발자가 직접 호출할 일은 없다.

반환값은 API상으로는 그냥 Popup이라고 하지만 실제로는 상황에 따라 {Light|Medium|Heavy} weight 팝업 이렇게 3개중 하나가 생성된다.(이는 Sun의 구현이 그런것이지 꼭 그렇게 된다고 가정할 수는 없다)

3가지 팝업의 차이를 알 필요가 보통은 없지만 알면 아는척 하기에는 좋다.

1) Lightweight Popup

말 그대로 실제 OS에게 추가적인 Window나 Widget의 생성을 요구하지 않고 비슷하게 그려서 자급자곡하는 ‘가짜’ 팝업 윈도우이다. OS차원에선 자원을 덜 사용하니 가볍다고 할 수 있지만 아무래도 ‘흉내내기’라 완벽하게 진짜처럼 동작하지는 않는다.(예를들어 Mac에서 팝업윈도우는 주위에 shadow가 곱게 깔리는데 이게 안나오기도 하고 focus 관련동작에서도 차이가 있을 수있다).
하지만 원한다고 항상 이를 얻을 수는 없다. 해당 컴포넌트(버튼)과 팝업윈도우를 하나의 top-level window에서 그릴 수 있는 입지적 위치를 갖추어야 한다. 예를들면 다음의 팝업메뉴의 팝업과 같은 경우다.
lightweight

2) Heavyweight Popup

OS에게 별도의 Top-level window 생성을 요청하여 얻어낸 팝업이다. 경량팝업과 반대의 특성을 가진다. 더없이 OS 친화적이지만 자원낭비가 살짝 있다. 이는 도저히 하나의 Top level window로는 각이 안나올때 사용된다. 아래와 같이 JFrame의 영역을 벗어나서 팝업을 보여주어야 하는 경우말이다.
heavyweight popup

3) Mediumweight Popup

이건 왠 말장난 같은 팝업인가 싶지만 이게 효율적으로 사용될 경우가 있다.
그렇게 하지 말라는 AWT와 Swing을 섞어쓰는 즉, Heavyweight과 lightweight 컴포넌트를 섞어쓰는 경우에 Lightweight popup으로 가능한 영역은 벗어나는데 그렇다고 새 top level window까지는 만들필요 없고 이보다는 가뿐한 Panel(java.awt.Panel)으로 커버가 가능한 경우에 사용된다.
medium weight popup

졸려서 자야겠다.