2011년 8월 28일 일요일

스윙으로 트리 만들기(JTree)


그림처럼 시원하게 한방에 JTree 클래스를 어떻게 사용하는지 공부하게 될텐데 내용이 tree보다는 node(노드)에 대해서 관심(?)을 가지면 아주 쉽게 이해가 될것이다. 노드란? 줄기처럼 계속 이어지는 것을 생각하면 될텐데 윈도우즈 탐색기에서 폴더 트리 + - 누르면 안에 폴더 뭐있는지 볼수있고 -누르면 다시 줄이고 이런거 자바에서 어떻게 만드는지 살펴보려 한다. 혀가 굳어서 그런지 설명하기 힘드네.ㅎㅎ 그림을 보면 무엇을 하려하는지 모두들 알아챌수 있을 것이니 오늘 만들 프로그램의 결과를 먼저 보기로 하자.






자바에서 JTree와 스윙의 tree 패키지 안에있는 DefaultMutableTreeNode라는 클래스를 이용하면 위와 같이 계속 새끼(?)치는 일을 할수가 있다. 필자가 설명에 집중하도록 하기위해 다소 용어가 거칠더라도 양해하기 바란다.ㅎㅎ 핵심은 여러분이 결과물을 보면서 느꼈는지 모르겠지만 계속 가지치기(?)를 할수 있는 폴더(Tree1)와 그냥 따로 폴더(Tree2 or Tree3)를 어떻게 만드는지 관심을 갖고 예제소스를 보면 눈에 들어올 것이다. 머리속에 쏙쏙 들어가도록 상당히 쉽게 정리하였으니 특별한 설명이 없어도 소스를 보는순간 세뇌(?)당하는 것처럼 저절로 모든 것이 술술 이해가 될것이니 긴장풀고 편안하게 아래 소스를 쳐다보기 바란다.^^


차례대로 읽어내려가면 이해가 안되는 것이 없을테지만 혹시나 눈에 안들어오는 이들(?)을 위해서 필자가 특별히 빨간펜으로 밑줄 쫙쫙 그어가면서 다시 한번 강의를 하겠으니 아래 칠판(?)을 보기 바란다. ㅎㅎ


강이의 자바강좌에서 최초(?)로 시도하는 빨간줄 쭈욱 그어가며 강조하는 명강의중에 명강의(?)라 할수 있겠다. 물 흘러가듯이 트리노드가 어떤 식으로 이어지는지 해당 결과물과 함께 비교해보면 따로 설명이 필요없다 하겠다.캬아~ 스윙을 공부하면서 느끼겠지만 add( )라는 메소드가 약방의 감초처럼 쓰이는데 JTree에서는 add( ) 메소드를 어느 인스턴스에다가 붙이느냐에 따라 폴더 트리가 달라지는지 유념해서 살펴보면 될것이다. 예제를 응용하면서 폴더트리를 자바에서 어떻게 만드는지 대략적인 그림이 여러분의 머리속에 그려졌길 바라면서 오늘 강의는 이쯤에서 접도록 하겠다.^^

2011년 8월 15일 월요일

스윙으로 글입력공간 만들기(JTextArea)


JTextArea를 이용해서 간략한 예제를 볼텐데 이미 JTextPane을 섭렵(?)한 여러분들은 그냥 읽어만봐도 될것이다. 어떻게 쓰이는지 아주 가볍게 살펴보기로 하겠다. 그럼 아래의 실행결과부터 보기로 하자.^^


위의 예제처럼 지정된 폰트로 일정하게 글을 일반적으로 출력할수 있는 기능을 갖춘 것이 JTextArea라고 생각하면 될것이다. 결과에서 보듯이 스크롤바를 넣었고 글의 내용을 보면 매줄마다 끊기지않고 연결되어 있는데 필자가 한줄한줄 띄워쓴게 아니라 메모장의 메뉴에서 서식에 있는 자동줄바꿈 기능처럼 여기서도 필자가 그런 기능을 추가하여 이렇게 출력되는 것이다. 어떻게 그런 기능을 넣었는지 예제소스를 보면서 이어가겠다.


특별한게 없기도 하지만 이제 이 정도는 보면 한 눈에 들어올 것이다. JTextArea는 쓴다고 했으니까 이제 이런건 예상이 될것이고 스크롤바도 마찬가지이고 특이한 코드 한줄이 setLineWrap( ) 메소드인데 이게 바로 텍스트창에서 자동줄바꿈 기능을 쓸수 있도록 만들어주는 명령이다. 유용한 기능이니 이거 하나라도 오늘 건져가기 바란다.ㅎㅎ 텍스트창에 들어갈 내용이 문자열 변수 s인데 내용이 긴 관계로 끊은 것이니 다르다고 이상하게 생각하지 않기 바란다.^^

2011년 8월 14일 일요일

스윙으로 테이블 만들기(JTable)

오늘은 스윙을 이용해서 테이블을 만들어 보기로 하겠다. 탁자를 말하는 것이 아니다. 아래와 같은 엑셀처럼 스프레드쉬트 그런 테이블을 만들어 보자는거다.ㅎㅎ


스윙에서 테이블을 만들때 이용하는 클래스가 바로 JTable이라는 클래스인데 JTable을 사용하면 테이블 각 요소 즉 칸에 자유롭게 글을 쓰고 수정할수 있다. 테이블에서는 각 단(칸)의 위치를 표현하기 위해 row랑 column을 보통 쓰는데 다른곳에서도 많이 쓰이니 별로 생소하지는 않으리라 본다. row는 옆으로 길게 늘어뜨린 열이나 줄같은 형태를 말하고 column은 세로로 정렬된 줄을 말하는데 보통 column에 각 요소에 대한 카테고리 제목을 쓰는게 일반적인 형태인데 위의 그림을 보면 감이 더 잘 잡힐 것이다. 여기 테이블에서 row나 column을 한국말로 표현한다면 row는 "가로단", column은 "세로단"이 되겠다. 그럼 테이블에 대한 명확한 개념을 여러분의 머리속에 집어넣기 위해 초심플 예제를 준비하였다. 아래를 보면서 계속하기로 하자.^^


뭔가 휑(?)하다.ㅎㅎ 가로단 2줄과 세로단 3줄로 만든 테이블이다. 모두다 이건 쉽게 이해하리라 생각하면서 예제 소스를 보기로 하겠다. 그 전에 노약자나 임산부는 소스 보는걸 자제하길 부탁드린다.(?) 너무 간단해서 기절할지도 모르니까 말이다.ㅎㅎ


예제에서 보면 JTable 쓰려고 import 한것이고 메인에서 보면 딱 한줄로 끝내버렸다. 새로 등장한게 table 인자밖에 없으니까 말이다. 코드처럼 괄호안에 (row,column) 갯수만 넣어주면 가로단 세로단 갯수데로 위와같이 테이블을 만들어준다. 그 뒤야 평소처럼 프레임에 테이블 장착시키면 끝이다. 그럼 다음에 또 보자.^^+

여기까지할까 하다가 하두 뒤가 따가워서 예제 하나를 더 준비하였다. 이번에는 직접 갯수를 넣어주는게 아니라 요소값을 넣어주면 그 갯수에 맞게 알아서 테이블을 자동으로 만들어주는 예제를 만들어보기로 하겠다. 배열이나 벡터로 이와같은 구현이 가능한데 우리는 친근한 배열로 이를 소화해볼 것이다. 필자가 테이블에 2차원 배열을 펼칠 것이니 경공(?)이 부족한 이들은 예전 스승의 가르침을 다시 전수받고 쫒아오기 바란다.ㅎㅎ


위의 그림은 인덱스가 이런식이라는걸 참고하라고 올린 것이니 다시한번 생각해보고 아래의 두번째 예제로 들어가보기로 하자.^^


이해하기 좋으라고 제목줄은 한글로 표기하였다. 각 위치에 따른 이해를 돕기위해 각 칸의 요소값은 인덱스로 표현한 것이니 그냥 보는데로 이해가 쉽게 가리라 본다. 본 예제는 2차원 배열의 값의 갯수에 따라 자동으로 테이블이 만들어지는데 어떻게 하면 이런것이 가능한지 예제를 보면서 살펴보기 바란다.


예전에 배운 2차원 배열이 기억이 난다면 거침이 없을 것이다. 그리고 이번 예제는 아까본 첫번째 예제와 다른 뚜렷한 특징이 있는데 JScrollPane을 썼다는 것이다. 뭐 그거야 스크롤바 기능 넣을려고 쓴거잖아라고 쉽게 넘길지 모르지만 테이블에서 이 기능을 첨가하면 의외의 보너스들이 생긴다. 일단 실행한 결과물을 마우스로 드래그앤드롭(잡아댕겼다가 놓는거..ㅎㅎ)으로 칼럼간의 이동이나 공간을 늘이거나 줄일수 있다. 뭐 당연하지만 안의 내용도 수정가능하고 말이다. 그런데 그것보다 더 중요한 점은 세로단 0 , 1, 2에서 보는 것처럼 맨위에다가 타이틀바를 만들수 있다는 것이다. 그냥 프레임에다가 넣는거랑 이런 부분에서 차이가 난다. 스크롤패인 빼고 프레임에다가 테이블 바로 넣고 해보면 뭐가 다른지 알게 될테니 직접 해보기 바란다. 참고로 스크롤패인 안쓰고 BorderLayout을 통해서 container에 집어넣으면 타이틀바를 만드는 것이 가능은 하다. 허나 굳이 편한길 놔두고 돌아갈 필요는 없어보인다. 스크롤바는 있으면 편하니까 말이다.

row는 2차원 배열로 column은 1차원 배열로 표현하였는데 테이블 자체가 2차원 배열로 거의다 구성가능하다. 우리가 3차원으로 테이블 만들일이 없으니까 말이다. 이렇게 예제에서처럼 배열 요소값을 넣고 테이블에 row,column값을 집어넣어주면 요소값의 갯수에 따라 테이블이 자동으로 만들어진다. 밑의 출력문은 참고하라고 필자가 친절(?)히 가로단과 세로단 갯수 몇개인지 프린트한 것인데 결과값 보면서 배열값 갯수 맞춰보기 바란다.^^

JScrollPane scroll = new JScrollPane(table);
frame.add(scroll);

다들 알고 있겠지만 스크롤바 인스턴스는 특별히 지금 다른데 써먹을데가 없으니 예제에서 쓴 frame.add(new JScrollPane(table));은 위의 두문장을 줄여서 바로 생성해서 집어넣은 것이다. 혹시 이 부분에서 멈칫(?)한 이들이 있다면 객체생성에 관한 예전 강의를 들춰보기 바란다.

스윙의 JTable을 이용하면 이렇듯 셀개념의 테이블을 손쉽게 만들수 있다. 한마디로 여러분이 자바를 이용해서 하나의 엑셀 프로그램을 만드는 것이나 별반 다를바 없다. 지금 스윙의 각 파트별로 하나씩 건드려 보고 있는데 따로보면 단순하겠지만 여러분이 각 파트를 이것저것 조합해서 모아보면 다기능이 첨가된 프로그램을 만들수도 있을 것이다. 아까 맨 위에서 본 그림처럼 체크박스나 캄보박스도 넣고해서 말이다. 여러분의 창의력과 상상력을 이용해서 작동이 되던 안되던 여러가지 아는 지식범위 내에서 떠오르는 것들을 시도해보라. 거기서 얻는 지혜는 필자가 가르치는게 불가능(?)할것이니까 말이다.^^

2011년 8월 13일 토요일

스윙으로 문서창 만들기(JTextPane)


자바에서 글자(Text)와 관련된 계보도의 맨 오른쪽 하단에 보이는 JTextPane이라는 클래스에 대해서 공부해 보기로 할텐데 마지막에 위치해서 그런지 벌써 풍기는 포스(?)가 심상치않다. 느껴지는가? ^^ 오늘 공부하게될 JTextPane은 밑의 문구처럼 여러가지 스타일의 문자형식을 가능하게 만들어주는 공간이다. JTextArea라는 기본적인 문자형식을 쓰는 방법도 있으나 이것은 필자가 후에 다른 섹션으로 묶어서 다시 언급할 것이므로 미리 하지 않으니 이에 대한 궁금증은 훗날 풀기로 하자. 매도 먼저 맞는게 마음 편하다고 스타일리쉬한 JTextPane부터 하고나면 JTextArea의 대부분은 스스로 풀릴 것이다.ㅎㅎ

필자와 처음으로 자바나 스윙을 공부하고 있는 회원들이라면 여러분과는 상관없는 얘기이니 그냥 평소처럼 따라오면 될것이다. 기존에 스윙을 공부했던 이들이나 다시 스윙에 손대기 시작한 이들은 아마도 JTextPane을 이용하는 것에 많은 어려움을 느꼈을 것이다. 그냥 기본적으로 글자를 쓰는것이 아니라 글자에 색깔이나 사이즈 혹은 굵기 같은 것을 조절해야하는데 물론 자바 api 설명서에 어떻게 쓰라고 나와있지만 유저의 입장이 아닌 프로그래머의 입장에서 이를 구현하는게 의외로 어려워 아주 힘들어하는 이들이 많다. 워드 같이 그냥 마우스로 찍찍 그어서 글자 속성 바꿀수도 없고 이걸 하나하나 명령코드로 만들어야하니 말이다.^^

스윙을 처음에 시작할때는 할만하다가도 여기쯤 오면 서서히 지쳐가는 이들이 속출하는데 데이터베이스 공부하는 것도 아니고 글자 속성(attribute)이니 스타일(style)이니 이래저래 이용해서 어쩌고저쩌고 하는데 코드도 엄청 복잡해 보이고 본인이 생각하는데로 프로그램이 잘 돌아가지도 않고 하니 아 여기까지인가?라고 하면서 답답하기만 했을 것이다. 그런 이들을 위해 성심성의껏 강의를 준비하였다. 그냥 따라오다보면 어느 순간 심봉사처럼 눈이 뜨일 것이다. 강이의 자바강좌 컨셉트와 일맥상통(一脈相通)이다. 그냥 따라오면 되는게 본 강의의 컨셉이니까 말이다.ㅎㅎ

필자가 자바의 스윙 부분에서 상당한 시간을 할애하고 있는데 이는 자바가 여러가지 기능상 편의성과 보안성이 뛰어난 부분이 있기도 하지만 그래픽 디자이너가 아닌데도 어느 정도의 그래픽 관련 유저 인터페이스 처리를 스윙을 이용해서 손쉽게 할수 있다는 점에서 자바가 더욱 널리 알려질수 있는 계기가 되었는데 이런 스윙을 차례차례 옆에 끼고서 자연스럽게 친해지는 학습을 하는 이가 드물뿐더러 여러분이 자바를 포기할때쯤에 스윙을 후따닥 배우고 거기다 기초적인 자바개념이 부족할때에 하다보니 공부하는데 어려워하고 여러가지 암초에 부딪치는 이들이 무수하다. 프로그램의 알맹이도 중요하지만 이제는 디자인 시대(?)가 아니더냐.ㅎㅎ 이런 시대에 여러분이 살아남기 위해서라도 스윙의 어느정도 선까지는 여러분이 편안하게 구사할수 있도록 필자가 이렇게 시간을 할당하고 있는 것이니 이에 대해 묻지도 말고 따지지도 말아라.^^

서론이 길었다~ 본격적으로 오늘 배울 JTextPane에 대해서 드디어 들어가도록 하겠다. 백문이 불여일견(百聞不如一見)이니 직접 실행결과를 보고 어떤 프로그램을 만들지 구경부터 해보기로 하자.^^


예제처럼 문서창을 띄우는 것인데 내용은 여러분이 힘들때 위로가 될수있는 박노해님의 "너의 하늘을 보아"라는 시()를 담았다. 필자가 오래간만에 시를 읊어서 그런지 한자가 절로 쓰여지는 것이니 의아해하지 말아라.ㅎㅎ 위에서 만난 한편의 부드러운 시와 같이 예제도 학습하기에 부드러운 소스가 되도록 요소요소에 필자의 코드파워(?)를 내심 후끈하게 불어놓았으니 공부하기 좋을 것이다. 예제 소스를 보기에 앞서 어떤 것들을 써야되는지 잠시 생각해보면 창이 있으니 관련된 프레임이나 패인이 있을수 있고 자세히 보니 스크롤바가 나오니 음 이런 기능을 하는 코드도 만들었겠구나 짐작해볼수 있겠다. 오케? 그거 팝업창 뜨면 자동으로 나오는거 아니야?라고 하면 무지 곤란하다.- 만드는 입장에서 그런거 기대하지 말아라.ㅎㅎ


예제 소스를 보면 알겠지만 조금 길다. 이번 단원을 어려워하는 이가 많아 이해하기 쉽도록 주석을 담고 여러분이 응용을 할수있는 부분까지 스스로 할수있게끔 작은 지면에 풍부한 내용을 담느라 그런 것이다. 시가 조금 길고 주석 처리한 부분도 있고해서 길어보이지만 이런 부분들을 제외하면 역시 강이의 자바강좌에서만 느낄수 있는 초간단 핵심예제라는 것에 공감하며 은연중 심취하게 될것이다.ㅎㅎ

그럼 필자와 함께 예제를 탐험하는 시간을 갖기로 하겠다. 그 전에 해야될 일은 무엇인지 알고 있겠지? 직접 실행해보고 예제에 대해서 생각해보기 바란다. 해석만 보고 땡치는 이가 없기를 간절히 바라면서 예제 탐험을 시작하겠다.^^

처음에 import 부분 보면 히햐~ 뭐가 무지 많다~ ㅎㅎ 벌써 기죽는 이가 있을지 모르겠는데 이런거 보면 담대해야한다. 음 맨 처음에 칼라쓰려고 뭐 불렀군. 그 다음 단락이야 많이 접해왔으니 알것이고 다음 단락에 보면 길기도 한데 그동안 못보던 한가지 공통점이 있다. 바로 text ㅎㅎ 그럼 여기서 미루어보아 스윙의 text 패키지에서 전부 불러왔으니 글자처리에 관련된 클래스를 써먹을려고 여럿 준비했구나라고 유추하면 될것이다.^^

자 그럼 이제 오늘 예제의 클래스 내용을 보자. 처음에 String을 이용해서 시를 문자열로 처리하였다. 특이사항으로 static을 써놨는데 왜 그런지는 후(?)에 알게되겠지만 주석 관심있게 읽어보면 알것이다. 문자열에서 \n 이라는 명령어를 " 안에다가 넣었는데 next line 뭐 이런거의 약자다. 자바에서 다음줄로 가라는 명령인데 알아두면 편리하기도 하고 프로그램 만들때 은근히 써먹을데가 많을 것이다. System.out.println( ); 이것을 딸랑 \n 하나로 대체가능하니 이보다 더 좋을순 없겠다. 허나 코드 보기 불편하니 알아만두고 과용하지는 말기 바란다.ㅎㅎ

문자열 처리부분은 여러분이 관심있게 보면 왜 저렇게 해놓았는지 알것이니 넘어가고 자바의 콘트롤타워인 메인메소드 내용을 보기로 하겠다. 앞의 절은 맨날 쓰는 것이니 이제는 척하면 삼천리일테고 그 다음에 보이는 context, document, style 인자들은 문서 처리할때 넣어가면서 써먹을려고 만든 것이니 말에서 풍기는 의미를 곰곰히 씹어가면서 공부하다보면 흡수될 것이다. 혹시 StyledDocument 인스턴스 생성하는데 StyledDocument가 아니고 DefaultStyledDocument가 나왔는지 의아해한다면 DefaultStyledDocument 자식쉐이(?)라서 그렇다.ㅎㅎ 필자가 의미하는바가 뭔지를 모른다면 예전 강의 중에서 상속부분에 관련된 객체생성 부분을 참고하고 컴백하기 바란다.^^

style에서 context(맥락,문맥)의 스타일, 즉 문자형식에 대한 기본값을 getStyle( ) 메소드를 통해 불러오고 있는데 일반적으로 쓰이는 가장 기본적인 값들을 이용하려고 말그대로 DEFAULT_STYLE을 사용하는 것이다. 글자를 출력하려면 글자폰트는 무엇이고 사이즈는 무엇이고 색깔은 무엇이고 일일히 지정해주어야할 것인데 이를 이용하면 가장 기본적으로 쓰이는 폰트체와 글자크기 그리고 글자색깔 같은걸 굳이 손댈 필요가 없다. 한마디로 여러분이 아무것도 정하지 않았을때 나오는 글자형식을 생각하면 될것이다.

다음으로 오늘 배우고 있는 JTextPane 인스턴스 생성해서 문자 처리할 텍스트창을 준비하는 과정이고 JScrollPane은 창크기에 따라서 텍스트 잘 읽을수 있도록 스크롤바를 프레임에 잘 넣어주십사하는 명령이다. 스윙에서 써먹을일 많으니 잘 알아두기 바란다.ㅎㅎ

다음은 문서의 기본값을 변경하는 방법을 기술한 부분인데 글의 단락은 왼쪽에 붙여서 보는게 일반적이나 경우에 따라서 멋들어지게 보이기 위해서 오른쪽에 단락을 배치하고 싶을수도 있고 글자크기도 좀더 크게 만들고 글자 색깔도 빨간색이나 파란색으로 하고 싶은 경우도 있을텐데 그럴때는 이곳의 주석처리한 부분을 응용해보면 어떻게 쓰는지 알수 있을 것이다.

다음은 띄어쓰기에 관련된 부분인데 필자가 지금 보여주는 그림과 함께 코드를 보면 그냥 이해가 팍팍 될것이다. 따라서 따로 부연설명은 하지 않겠다.ㅎㅎ


노파심(?)에 간단히 덧붙이자면 지금 위에 음영처리한 부분이 글의 paragraph(단락)이다. 예제에서는 시라서 단락이 두줄밖에 안되어 효과가 별로 없지만 시 대신에 소설이라든지 수필이라든지 하여간 긴 문장으로 단락을 만들고 창의 사이즈를 줄였다 폈다 해보면 위의 띄어쓰기 명령어들이 어떻게 작동하는지 잘 이해가 될것이다. 아래의 예제결과를 위의 예제결과와 비교하면서 곰곰히 살펴보면 글이 짧더라도 뭐가 달라졌는지 조금은 눈에 보일 것이다.^^


try catch 부분을 보면 예외처리를 해놓았는데 예제처럼 insertString( ) 메소드를 이용한 문자삽입을 할시 이렇게 예외를 처리해주어야 해서 한것이다. 예외처리 구문에 대해서 잘 모르겠거나 기억이 희미하다면 예전 강좌를 다시 한번 공부하고 돌아오기 바란다. insertString( ) 메소드의 첫번째 인자는 어느 위치에 두번째 인자로 쓴 관련 문구를 넣을 것인지 수치로 표현하는 것이고 글자에 대한 처리는 이렇게 속성처리하라고 세번째 인자에 attribute이라는 인자명을 넣어준 것이다. 즉 맨 처음에 제목을 쓴것인데 위의 attribute 관련문구를 보면 이탤릭체로 하고 조금 진하게 쓰고 거기다가 밑줄 쫘악 쓰라고 해놓은 것이다.

두번째 insertString( ) 메소드는 맨 위에 써놓은 시 전체를 텍스트창에 출력하라는 것이고 style은 아까 기본값을 한다고 하였으니 여러분이 따로 변경하지 않은 이상 평범한 문체(?)로 출력될 것이다.

마지막의 두문장은 이제 지겹도록 보아왔을 것이니 건너뛰겠다. 정신없이 오다보니 벌써 어느덧 마칠 시간이 다 되어가는구나. 설명과 함께 예제를 쭈욱 훓어보니 이거 할만하네!라고 생각하는 이들이 꽤 될것이다. 프로그램이 이해가 되기 시작하면 사실상 기술적인 코드 명령들은 여러분이 응용해가면서 공부하다보면 자연적으로 따라오게 되어있다. 이 단원이 어렵게 느껴지는 이유중에 하나가 명령어들도 조금 낯설고 특히 클래스명이나 메소드명이 조금 긴편이다.ㅎㅎ 아마 그래서 다가가기 힘들었을 것이나 이제는 그렇지 않으리라 기대하면서 오늘은 특별히 자바의 스윙을 공부하면서 힘들고 지친 영혼들에게 예제에서 본 박노해님의 시를 선사하면서 오늘의 강좌를 마치기로 하겠다. 잠시나마 마음의 평안을 얻기 바란다.^^


너의 하늘을 보아 - 박노해


네가 자꾸 쓰러지는 것은
네가 꼭 이룰 것이 있기 때문이야


네가 지금 길을 잃어버린 것은
네가 가야만 하는 길이 있기 때문이야


네가 다시 울며 가는 것은
네가 꽃 피워 낼 것이 있기 때문이야


힘들고 앞이 안보일 때는
너의 하늘을 보아


네가 하늘처럼 생각하는
너를 하늘처럼 바라보는


너무 힘들어 눈물이 흐를 때는
가만히
네 마음의 가장 깊은 곳에 가 닿는
너의 하늘을 보아

2011년 8월 11일 목요일

스윙으로 파일선택창 만들기(JFileChooser)


오늘은 스윙의 JFileChooser를 이용하여 파일선택창을 만들어보도록 하겠다. 어떤 소프트웨어든지 실행시키고 들어가면 파일메뉴에 Open이라든지 Save라는 메뉴버튼이 보통 있을 것이다. 그럼 파일을 열고 저장할수 있는 창이 나오는데 이걸 자바에서 만들어보고자 한다. 필자가 무슨 말을 하는지 못알아듣겠다면 아래의 그림을 보면 아! 이거~ 라고 금방 캐치할수 있을 것이다.^^



뭔가 그럴듯하게(?) 보인다.ㅎㅎ 소스는 간단하면서도 심오하다. 강이의 자바강좌에서 사용되는 모든 예제는 필자가 직접 서술한 것이다. 그러기에 아주 강력하면서도 파워풀하게 여러분의 머리속으로 쏙쏙 들어갈 것이다. 오늘도 예외는 없다.ㅎㅎ 긴장하고 있다면 마음을 가라앉히고 필자의 한마디 한마디에 귀를 기울이면서 예제를 공부하면 큰 어려움은 없으리라 본다. 그럼 예제 소스를 보면서 따라오기 바란다.^^


예제를 보면 swing 패키지뿐만 아니라 io 패키지도 사용하고 있는데 파일을 건드리는 것이니만큼 이미 예상한 이도 있었을지 모르겠다. 어차피 이런거 깊이 들어가면 하루종일 해도 끝이 없을 것이다. 그냥 파일을 건드리니 io 패키지의 File 클래스도 건드리는구나라고 가볍게 터치하면서 넘어가기 바란다.

그럼 메인메소드속으로 들어가보겠다. 파일선택창을 만들려고 JFileChooser 클래스를 이용하여 인스턴스를 만들었다. 밑에 보면 주석이 있는데 괄호안에 디렉토리명을 써주면 파일선택창이 열림과 동시에 여러분이 지정한 해당 디렉토리에서 시작한다. 아무것도 안써주면 여러분이 쓰고 있는 OS 설정이 되어있는 디렉토리에서 시작한다. 즉 여러분이 윈도우즈의 파일탐색창 같은걸 열었을때 시작하는 디렉토리와 같은 곳에서 시작할 것인데 아마 보통의 경우라면 여러분의 내문서 폴더에서 시작할 것이다.^^ 해당 디렉토리 지정시 주의할 점은 슬래쉬가 보통때 쓰는 역슬래쉬가 아니라 그냥 슬래시(/)를 쓴다는 것이니 해보고 안된다고 필자한테 항의(?)하는 이가 없길 바란다. 이런거까지 정성껏 알려주는 이는 필자가 유일할 것이니 몰랐다면 감사의 묵념(?)을 드리는 시간을 잠깐 갖기 바란다.ㅎㅎ

FileFilter를 사용해서 파일확장자를 지정해줄수 있다. 예제에서는 확장자가 .java라는 파일을 파일선택창에서 보여주라고 지정한 것인데 다른걸 원하면 java 글귀 대신에 mp3나 txt 같은걸로 고쳐서 해보면 무슨 말인지 금방 알게 될것이다. 앞에 java files 라는건 위의 그림보면 알겠지만 파일종류 설명 적어놓은거다. 중간에 있는건 점(.)이 아니라 콤마(,) 쉼표니까 괜히 점찍지 말아라.ㅎㅎ

밑의 add 필터부분은 여러분이 파일을 선택했을때 말그대로 필터링 각각 상황에 따른 처리 알아서 해주는 기능인데 여러분이 파일을 선택할수도 있고 디렉토리를 선택할수도 있고 아니면 그냥 창안에 빈공간의 아무데나 클릭할수도 있겠다. 그런 상황별 처리를 해준다 생각하면 되겠다.^^

자 이제 여러분이 파일을 선택했을때 간단한 메세지를 출력하도록 필자가 안배해놓은 부분이다. 여러분이 선택한 파일을 열면 그 파일에 대한 정보를 수치로 받아서 무슨 이름의 파일인지 출력하고 그 파일이 어느 디렉토리에 있는지 해당 디렉토리 루트를 출력하라는 예제이다. 더 자세히 설명하자면 if문에서 파일 선택하여 열었다는 신호가 오면 getSelectedFile( ).getName( )을 이용해서 파일이름 출력하고 여기서 getName( )만 빼서 출력시키면 바로 파일명과 함께 해당 디렉토리의 루트도 같이 출력된다.^^

예제를 직접 실행시켜보면 필자가 이렇게 장황하게 설명한 보람도 없이 예제만 갖고도 여러분이 기본적으로 알아야할 JFileChooser에 관련된 대부분의 내용이 손쉽게 흡수될 것이다. 나름데로 응용해보면서 오늘 배운 내용을 잘 정리하기 바란다.^^

2011년 8월 5일 금요일

스윙으로 편집창 만들기(JEditorPane)


오늘은 스윙을 이용한 자바의 편집창에서 html 소스를 불러오는 방법을 공부하려 하는데 제목에서 보다시피 JEditorPane이라는 클래스를 이용해서 강이의 자바강좌가 연재되고 있는 현재 홈페이지 주소인 http://alecture.blogspot.com 의 블로그를 스윙 편집창에 삽입해 보도록 할터인데 인터넷 브라우져처럼 html 소스를 완벽히 해석하지 못하니 군데군데 깨져서 나온다. 원래 그런것이니 이거 가지고 딴지거는 이(?)가 없길 바란다. 이건 필자의 잘못이 아니다.ㅎㅎ


필자의 강의가 전달되고 있는 블로그의 소스가 철저하게 공개(?)되는 순간이니 예제 열심히 들고파기 바란다. 사실 예제소스가 워낙 간단한지라 팔것도 없다. 그동안 스윙 배우면서 여기까지 온 이들은 실망(?)할지도 모르겠다. 허나 역으로 되짚어보자면 필자가 JEditorPane의 핵심만 넣은 초간단 예제라 코드가 짧은 것이니 실망을 넘어 고마운 마음(?)을 가지고 공부에 임하기 바란다.^^


이제 여러분의 스윙(야구 아님 --) 실력으로도 이 정도는 그냥 보면 이해가 바로 된다고 필자는 강하게 믿고있다.ㅎㅎ 스윙 에디터창 쓰려고 JEditorPane 객체 생성하였고 setPage 메소드를 이용해서 url 주소를 불러들였다. url 주소는 예외가 날수 있으므로 예외처리를 위해서 메인메소드에 throws Exception 붙인거다. 안붙이면 정말 에러날까? 라고 생각하는 호기심 많은 이가 있을 것이다. ㅎㅎ 똘똘한 학생이냠.. 궁금하면 직접 빼보고 해본다. 손가락 까딱하기 싫어서 그냥 행동에 옮기면 알것을 질문하는 것들은 필자가 뭐라고 했나? ㅎㅎ 초반에 무지 강조했다. 무식하게 한번이라도 소스 쳐보는 이가 그냥 스쳐지나가는 이들보다 후엔 엄청난 차이로 앞서나가게 된다는 것을 수도없이 강조했으니 이 정도로 하겠다. 다음줄이야 프레임에 스크롤바까지 넣어주라는 것인데 예전에 아마 써먹은적 있을 것이다. 어디에서였는지 기억은 안나는데 아는 이들은 알려주기 바란다.ㅎㅎ

프로그래밍 소스는 본래가 긴게 어려운게 아니라 짧은만큼 심오하고도 내용이 난해하다. 왜냐하면 여러줄을 쳐야될 것을 프로그래머의 역량(=게으름)에 따라 아주 짧게 줄여서 쓰기 것이니 프로그램의 흐름을 제대로 파악하지 못하면 해독하는데 상당한 어려움을 겪게된다. 이를 바탕으로 생각하면서 오늘 예제를 보면 코드가 아주 아주 짧았으니 내용이 매우 심오하고도 난해했을터 이해가 쉽게된다면 여러분의 자바 스윙 레벨이 이제 어느정도 고단계에 진입한 것이니 자축하여도 될것이라. 믿거나 말거나~ ㅎㅎ

2011년 8월 2일 화요일

스윙으로 색상선택창 만들기(JColorChooser)

오늘은 자바의 스윙을 통한 칼라츄저로 색깔선택 아니 칼라선택 아니 색상선택창(?)을 만들어 보도록 하겠다. 한국말이 역시 더 어려우니 칼라추저 하여간 이거 오늘 공부할텐데 내용이 쉽지 않은 부분이다. 하지만 함께 해온 이들은 알겠지만 그냥 쭈욱 읽어보면 이런거구나라고 자연스럽게 이해될테니 걱정스럽더라도 가보자.^^ 오늘 강의를 통해서 자바로 칼라를 쓰는 방법을 처음으로 배우게 될테니 기대하시라~ 쨔쟈안~~ ㅎㅎ




위의 그림들을 보면 알겠지만 오늘 배울 JColorChooser 클래스로 일석삼조(?)가 가능하다. 그림보면 필자가 아주 거창한 칼라 팔레트 다이얼로그창을 자바코드로 만든듯 보이는데 알고보면 이거 구현하는 코드는 제이칼라츄저 클래스만 생성하면 자바 스윙에서 위처럼 쓸수 있게 만들어주니 자바가 참 똘똘(?)하다.

여러분이 필자가 올릴 예제를 실행해보면 알겠지만 이곳 사이트 주소의 색깔을 그림에서 보는 칼라 팔레트를 통해서 자유자재로 바꿀수 있다. 로고글자 디자인할때 이제 이처럼 자바 팔레트창을 이용해보는 것도 가능하겠다. 자동으로 파일 만들어주는 기능은 없으니 그건 여러분이 알아서 그림 짤라다가 편집(?)해서 쓰는 지혜(?)가 필요하겠다.ㅎㅎ


이게 바로 예제 소스인데 생각보다 어려울 것이다. 허나 역으로 예제중에선 이게 제일 쉬울 것이다. 필자가 군더더기를 굉장히 싫어하기 때문에 오로지 엑기스 중의 자바 천연 액기스로만 철저 무장해서 소스를 만들었다.ㅎㅎ 어렵게 생각하는건 아마 개념이 어렵기도 하고 일단 칼라를 쓰는 과정이 object를 주거니 받거니 하기 때문에 그럴수도 있겠으나 그런 까닭에 필자가 오래간만에 소스에 필자의 초특급 진혼사귀 공력(?)을 불어넣어놨으니 그냥 읽으면 혼이 빠진듯이 이해가 술술되면서 머리속에 들어갈 것이다.ㅎㅎ 정신이 들면 다 까먹을지 모르니 복습은 꼭 하기 바란다.^^

중간에 보면 셋폰트 어쩌구저쩌구 하는 부분은 폰트종류랑 굵게 쓰기 사이즈 뭐 그런거 정할수 있다는건데 자세한 내용은 java.awt.Font 에 들어있으니 api 찾아서 보기 바란다. 메인메소드 처음이랑 끝은 스윙에서 이제껏 해왔던 것이니 다들 알것이고 final을 붙였는데 이건 내부클래스에서 쓰려면 붙여야하는 것인데 왜 붙였는지 궁금한 이들은 생략하고 프로그램을 실행해보기 바란다. 그럼 저절로 알게 될것이다.ㅎㅎ

리스너랑 이벤트도 해본 것이라 대충 알겠지만 여기서도 마찬가지로 유저의 액션을 프로그램에서 받아들이기 위해 준비한 것이다. 여기서는 색상선택창이니 유저가 칼라를 선택했을때 그에 대한 액션을 글자에 반영시켜야하니 이런 리스너랑 이벤트 구문이 필요하다. 주석을 자세하게 써놓았으니 천천히 읽어가면서 연구해보기 바란다.^^