2012년 6월 17일 일요일

스윙으로 내부프레임 만들기(JInternalFrame)


Special-Purpose Containers
JInternalFrame
JLayeredPane
Root pane(JRootPane)


오늘부터는 UI에서 특정한 목적을 수행하기 위해 쓰이는 콤포넌츠에 대해서 공부해 보기로 하겠다. 위의 총 3가지 콤포넌트들을 살펴볼텐데 각각의 컨테이너들이 어떻게 쓰이는지 각 요소별로 필자의 예제와 곁들인 학습을 통해 여러분의 사고력을 증진시키는데 중요한 시간이 되리라 기대하면서 순서대로 오늘부터 학습하겠다. 그럼 오늘은 JInternalFrame에 대해서 알아보면서 슬슬 시작해보자.^^


JInternalFrame의 단어에서 풍기는 의미를 분석해보자. J로 시작하니 자바스윙이고 Internal이라고 하니 뭔가 안에 있는 것이고 Frame이라고 하니 프레임인가 보다. 그러니 자바스윙으로 내부프레임을 지칭하고 있는 함축적인 의미가 영어단어만 봐도 머리속에 팍팍오고 있을 것이라 기대하면서도 깊은 의심이 맴돌고 반신반의하는 마음이 교차하고 있지만 필자는 여러분을 굳게 믿고 묵묵히 강의를 진행해 보겠다.ㅎㅎ




오늘 공부하게될 예제의 결과물을 여러분의 흥미를 돋구기 위해 미리 공개하였다. 위의 그림에서 보다시피 가장 바깥에 항상 있는 기존 프레임 안을 보면 총 5가지의 내부프레임이 보일 것이다. 이 5가지의 내부프레임을 통해 여러분은 내부프레임으로 구성할수 있는 5가지 핵심기능들의 정수들을 바로 오늘 이시간 필자의 예제를 통해 짜릿한 흥분과 엄청난 경외심을 느끼면서 공부하게 될것이라 내심 흠칫 기대해 보면서 슬슬 이야기 보따리를 풀어보겠다.^^

예제코드를 보기에 앞서 여러분의 이해도를 높이기 위해 JInternalFrame을 쓸때 항상 염두에 두면서 프로그램을 짜야하는 사항이 있는데 그중에서 가장 기본적인 사항들을 간략하게 설명하자면 첫째로 내부프레임을 쓰기위해서 컨테이너에 집어넣어야 하고, 둘째로 사이즈를 지정해야하고, 셋째로 위치를 지정해야하고, 넷째 마지막으로 이것을 보이게끔 설정해 주어야한다.

지금 저게 무슨 말이지 정신이 멍한 이들이 있다면 그것은 너무도 당연한 것이다. 배우지도 않았는데 어떻게 벌써 다 이해한단 말인가? 원래 강의란 것이 좀 어렵다싶은 화두를 던져놔야 그게 나중에 그럴듯해 보인다.ㅎㅎ

자 설명 들어간다. 내부프레임을 만들려고 하는데 그럼 당연히 어느정도 크기로 만들어야지하는 기본적인 질문이 생길것이다. 그리고 프레임안에 넣으니 어디에 표시를 해야될지 생각하게 될거고 내부프레임 기본 설정이 자바에서는 기존 프레임처럼 원래 보이지 않게끔 되어있다. 따라서 이것을 보이게끔 바꿔줘야 써먹을수가 있도록 자바에서 만들어 놨으니 그냥 보이게끔 설정하는 방법만 알면된다. 너무 당연한걸 풀어서 설명하니까 어이가 없을 것이다. 이제 이 당연한 것을 예제코드로 보면서 여러분이 궁금해할만한 포인트만 콕콕 찝어서 풀어내도록 하겠다.^^


필자가 내부프레임에 대해서 핵심만 공부할수 있도록 정성에 정성을 담았으니 여러분은 온 힘을 기울여 필자의 정성을 쪽쪽 빨아가야 할것이다. 자 그럼 예제를 분석해 보도록 하자. 여러분이 위의 클래스 불러들인 것을 보면서 내부프레임 클래스 말고 JDesktopPane이라고 하는 생소한 클래스가 하나 보일 것이다. 아까 필자가 컨테이너에 넣어서 내부프레임을 만들어야 보인다고 했는데 보통 이 클래스에다가 내부프레임을 넣어서 보이도록 만든다.

JDesktopPane은 JInternalFrame의 부모격으로 쓰인다고 생각하면서 이용하면 이해가 쉬울 것이다. 또한 JDesktopPane에서 기본적으로 유저인터페이스의 자바 룩앤필이 적용되어 있으니 내부프레임이 조금 그럴듯하게 기존 윈도우 프레임보다 멋있게 나온다.

다시 프로그램으로 돌아가서 보면 이 예제의 핵심 부분은 바로 Enhanced For Loop 안에 있는 것이 지금 공부해야될 내부프레임의 요체라 할수 있겠다. 사실 포룹 위아래에 있는 것은 여태껏 지겹게 보아왔을 것이므로 설명 생략하고 본론으로 들어갸겠다. 그리고 향상된 포룹 형태인 enhanced for loop에 대해서 까먹었다면 필자가 예전에 강의했던 for loop 강좌를 다시 한번 숙지하고 이 자리로 돌아와서 보기 바란다. 필자 리바이벌은 안한다.ㅎㅎ

왜 필자는 For 룹을 굳이 이용했을까? 이런 의문이 드는가? 그럼 다시 한번 예제의 결과물을 쳐다보기 바란다. 내부프레임을 5개 만들려고 한다. 프레임이 다 비슷비슷하다. 그림처럼 코드도 거의 비슷한 것이 5번이나 반복될 것인데 이것을 왜 5배나 힘들게 생고생해야하나? 배운 것은 써먹자. 제발, 아끼지 말고~ ㅎㅎ

public JInternalFrame(String title,
                      boolean resizable,
                      boolean closable,
                      boolean maximizable,
                      boolean iconifiable)

지금 위의 코드는 바로 JInternalFrame의 생성자 중 하나인데 필자의 예제에 있는 internalFramesArray가 바로 이를 기초로 하고 있다. 첫째 매개변수는 제목을 쓰는데고, 두번째는 프레임에다가 마우스 갖다대면 화살표로 바뀌면서 폈다 줄였다 하는 기능이고, 세번째는 창을 닫게 하는 기능, 네번째는 보통 프레임 오른쪽 상단에 보면 중간에 있는 버튼으로 화면 확대와 줄임 기능이고, 다섯번째는 보통 프레임 첫번째에 위치하는 버튼으로 화면을 최소화할때 사용하는 기능을 말하는데 이게 boolean이다. 따라서 true나 false로 가능하게 만들지 아니면 사용하지 못하게 할지의 여부를 결정할수 있는 것이다. 예제의 배열에서 필자가 false를 각 요소마다 하나씩 넣은 이유가 이런 기능들을 프로그램을 구동시키면서 살펴보라고 고려한 끝없는 배려심이 담겨있는 것이니 그점 생각하면서 직접 버튼을 눌러보면서 차이점을 알아보는 시간을 필히 갖기 바란다.^^

그리고 필자가 예제의 핵심부분이라고 말했던 for 룹은 실상 가르칠게 없다. 여러분은 이미 알게모르게 내부프레임의 정수를 깨우치고 있을 것이기 때문이다. 필자가 내부프레임을 만들때 염두에 두어야 하는 사항 네가지를 이미 알려주었다. 그 네가지 사항이 바로 for 룹안에 있는 네단락에서 펼쳐지고 있는 것이다. 내부프레임을 어떻게 만드는지 프로그램의 흐름을 이미 알고있다면 그냥 보기만해도 저절로 이해가 될것이다. 굳이 들어가자면 사이즈와 크기를 지정하는 방법이 궁금할텐데 필자가 이미 그건 주석을 달아 한큐에 해결해 버렸으니 더 설명할 것도 없을 것이나 그래도 궁금해하는 이들이 혹여나 있을까봐 조금만 더더 설명하겠다.ㅎㅎ

사이즈와 크기를 한큐로 해결하는 방법이 콤포넌트에 있는 setBounds( )라는 메소드를 이용하는 방법이다. 물론 setSize나 setLocation같은 메소드를 이용할수도 있겠으나 좋은 길 놔두고 굳이 돌아갈 필요는 없다하겠다.

public void setBounds(int x, int y, int width, int height)

바로 위의 코드인데 x랑 y는 중심 좌표로 위치를 찍을수 있고 width랑 height을 통해 프레임의 가로와 세로 사이즈를 정할수 있다. 그리고 CENTER가 들어가 있는 것들은 원하는 곳에 위치를 설정해 주는 것인데 프레임을 최소화하거나 최대화시켰을때 내부프레임이 제대로 표시되도록 해주기위한 장치이다. 이게 말로 설명하는 것보다 이거 없애버리고 직접 실행해보면 저절로 알게된다. 마지막으로 setVisible( ) 메소드를 통해 보이게끔 만들어주는데 기존 프레임처럼 내부프레임도 이것이 있어야 볼수 있음을 잊지 말기 바란다. 한마디로 내부프레임을 만들면서 기본적으로 고려해야할 사항 네가지를 여러분이 숙지한다면 거침이 없을 것이다.^^