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은 아까 기본값을 한다고 하였으니 여러분이 따로 변경하지 않은 이상 평범한 문체(?)로 출력될 것이다.

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


너의 하늘을 보아 - 박노해


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


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


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


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


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


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

댓글 1개:

  1. 우와,,, 자바 공부하는 학생입니다. 좋은정보 감사합니다! JTextPane을 급히 손댈일이 생겼는데 많이얻어가요 ㅎㅎ
    음,, 질문해도 될지 모르겠지만요! 위 '너의 하늘을 보아'라는 시를 오른쪽정렬하는 방법에 대해서 궁금하네요! ㅠㅠ
    (그것도 한 행은 오른쪽정렬, 다른행은 왼쪽정렬 계속 교차해서요..)

    답글삭제