공통 Swing 컴포넌트를 생성, 구성, 디스플레이하기 위해 작성하는 루틴, 상투 코드를 생각해 보자. 이를 테면, 하나의 테이블에서 데이터를 디스플레이하기 위해 필요한 모든 것들을 생각해 보자. JDesktop Network Components (JDNC) project는 풍부한 데이터 중심 Java Desktop 클라이언트의 생성을 용이하게 하는 것이 목표로 하고 있다. 이번 테크팁에서는 JDNC를 이용하여 하나의 파일로부터 탭으로 분리된 데이터를 읽고 테이블로 표시하고, 각 열에 제목을 붙이고 디스플레이하고자 하는 부분을 선택해보도록 하자. 어떤 특정 조건을 만족하는 행만을 표시하도록 행을 필터링 할 수도 있으며, 이 리스트를 정렬하여 각기 다른 여러 색상으로 장식할 수도 있다.

우선 날씨 데이터를 텍스트 파일에서 읽어들여 JScrollPane 내부의 JTable에 디스플레이 하는 경우를 생각해 보자. JScrollPaneJPanel의 내부이며, JPanel JFrame의 내부이다. 2005년 3월 8일자 테크 팁 JTable 출력하기에서 이와 비슷한 작업 방식을 다룬적이 있다. JDNC를 이용하면, 날씨 데이터를 다음 XML로 읽을 수 있다.

   <table>
     <tabularData source="weather.txt"/>
   </table>

다시 말해, 테이블 엘리먼트를 하나 생성하고, 그 데이터를 포함한 파일의 위치를 지정하기만 하면 된다.

이 예제를 실행하기 위해서는 JDNC 최신 배포판을 다운로드하기 바란다. 최신 버전은 0.7이며 J2SE 5.0을 필요로 한다. jdnc-0_7-bin.zip을 다운로드하여 압축을 푼다. 이번 테크팁의 경우에는 jdncTip이라는 디렉토리를 만들고 jdnc-0_7/lib (code>jdnc-0_7-all, jdnc-runner, jlfgr-1_0)에서 jar 파일 3개를 복사한다. jdnc-0_7/demo/data에서 weather.txt 파일을 복사하여 jdncTip directory에 넣는다. 다음 파일을 생성하고 jdncTip에 디렉토리에 table.jdnc로 저장한다. 다음은 기본적으로 jdnc-0_7/demo에 포함된 간단한 simpleTable.jdnc 예제이다.

   <?xml version='1.0'?>
   <om:resource xmlns:om="http://www.openmarkup.net/2004/05/om"
     xmlns="http://www.jdesktop.org/2004/05/jdnc"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation=
       "http://www.jdesktop.org/2004/05/jdnc schema/ jdnc-1_0.xsd">

     <table>
       <tabularData source="weather.txt"/>
     </table>

   </om:resource>

이 애플리케이션을 실행하기 위해서는 특정 클래스 경로(classpath)에 방금 복사한 jar 파일 3개가 있어야 한다. 또한 메인 클래스가 org.jdesktop.jdnc.runner.Application이라는 점을 반드시 명시해야 한다. jdnc 파일의 이름은 명령문 인수로 주어진다.

Unix나 Linux 머신에서 이 명령문은 다음과 같다:

   java -cp jdnc-runner.jar:jdnc-0_7-all.jar:jlfgr-1_0.jar
   org.jdesktop.jdnc.runner.Application table.jdnc

Windows 컴퓨터에서 명령문은 다음과 같다:

   java -cp jdnc-runner.jar;jdnc-0_7-all.jar;jlfgr-1_0.jar
   org.jdesktop.jdnc.runner.Application table.jdnc

날씨 데이터를 포함한 테이블이 표시되는 것을 볼 수 있다.

Simple Table

디스플레이된 테이블에서의 열 제목은 일반적으로 column0, column1 등으로 일반화되어 있다. 열의 제목을 디스플레이하기 위해서는 전체 열의 리스트를 순서대로 제공해야 하는데, 이는 tabularData 엘리먼트의 차일드로 metaData 엘리먼트를 추가하면 된다. 이 열들에 대한 레이블은 다음과 같이 테그를 이용해 붙인다:

   <columnMetaData name="ICAO"/>

열의 내용은 디폴트로 string 인 것으로 처리가 되며, string 타입이 아닌 데이터는 다음과 같은 태그를 이용해 지정할 수 있다.

   <columnMetaData name="ELEVATION" type="float"/>

가능한 타입은 string, float, integer, date, href이다. table.jdnc file에 메타데이터 엘리먼트를 추가하여 다음과 같은 형태로 만든다.

   <?xml version='1.0'?>
   <om:resource xmlns:om="http://www.openmarkup.net/2004/05/om"
     xmlns="http://www.jdesktop.org/2004/05/jdnc"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://www.jdesktop.org/2004/05/jdnc
     schema/jdnc-1_0.xsd">

     <table>
       <tabularData source="weather.txt">
         <metaData>
           <columnMetaData name="ICAO"/>
           <columnMetaData name="STATION"/>
           <columnMetaData name="REGION"/>
           <columnMetaData name="COUNTRY"/>
           <columnMetaData name="ELEVATION" type="float"/>
           <columnMetaData name="LATITUDE" type="float"/>
           <columnMetaData name="LONGITUDE" type="float"/>
           <columnMetaData name="TIMESTAMP"/>
           <columnMetaData name="TEMPERATURE" type="float"/>
           <columnMetaData name="DEWPOINT" type="float"/>
           <columnMetaData name="HUMIDITY" type="integer"/>
           <columnMetaData name="VISIBILITY_QUAL"/>
           <columnMetaData name="VISIBILITY" type="float"/>
           <columnMetaData name="WIND_DIR"/>
           <columnMetaData name="WIND_DEG" type="integer"/>
           <columnMetaData name="WIND_SPEED" type="float"/>
           <columnMetaData name="GUST_SPEED" type="float"/>
         </metaData>
       </tabularData>
     </table>
   </om:resource>

이제 테이블은 방금 만든 열의 제목이 포함된 상태로 다음과 같이 표시되어야 한다.

Labeled Table

열에 레이블을 붙인 다음 보이게 할 열과 그 순서를 쉽게 지정할 수 있다. 표시하고자 하는 각각의 열에 대해 column 엘리먼트를 포함하는 columns 엘리먼트를 생성할 수 있다. 다음은 포함된 열을 지정하는 일반적인 방법이다.

   <column title="Station" binding="STATION"/>

또한 데이터 자리맞춤을 지정할 수도 있다. 예를 들어, 온도 데이터를 중앙에 오도록 하면 테이블이 더 보기 좋을 것이다. 아래와 같이 간단한 방법을 사용할 수 있다.

   <column title="&#176;C" binding="TEMPERATURE"
                 horizontalAlignment="center"/>

title 속성은 그 열에 대한 새로운 제목을 지정한다. 이전 예제에서는 title 속성이 지정되지 않았으므로 각 columnMetaData 태그에서 지정한 이름이 사용되었다. 다음은 디스플레이를 위해 5개의 열을 정의하는 column 엘리먼트를 추가하고, 이 열들이 디스플레이 될 제목, 그리고 자리맞춤을 지정하면 table.jdnc 파일이 어떻게 되는지를 보여주고 있다.

<?xml version='1.0'?>
<om:resource xmlns:om="http://www.openmarkup.net/2004/05/om"
  xmlns="http://www.jdesktop.org/2004/05/jdnc"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation=
    "http://www.jdesktop.org/2004/05/jdnc schema/ jdnc-1_0.xsd">

  <table>
    <tabularData source="weather.txt">
      <metaData>
        <columnMetaData name="ICAO"/>
        <columnMetaData name="STATION"/>
        <columnMetaData name="REGION"/>
        <columnMetaData name="COUNTRY"/>
        <columnMetaData name="ELEVATION" type="float"/>
        <columnMetaData name="LATITUDE" type="float"/>
        <columnMetaData name="LONGITUDE" type="float"/>
        <columnMetaData name="TIMESTAMP"/>
        <columnMetaData name="TEMPERATURE" type="float"/>
        <columnMetaData name="DEWPOINT" type="float"/>
        <columnMetaData name="HUMIDITY" type="integer"/>
        <columnMetaData name="VISIBILITY_QUAL"/>
        <columnMetaData name="VISIBILITY" type="float"/>
        <columnMetaData name="WIND_DIR"/>
        <columnMetaData name="WIND_DEG" type="integer"/>
        <columnMetaData name="WIND_SPEED" type="float"/>
        <columnMetaData name="GUST_SPEED" type="float"/>
      </metaData>
    </tabularData>

    <columns>
      <column title="Station" binding="STATION"/>
      <column title="Country" binding="COUNTRY"/>
      <column title="°C" binding="TEMPERATURE"
              horizontalAlignment="center"/>
      <column title="Wind Direction" binding="WIND_DIR"/>
      <column title="Wind Speed" binding="WIND_SPEED"
              horizontalAlignment="center"/>
    </columns>
  </table>

</om:resource>
Reduced Table

이번에는 Bolivia에 대한 데이터만 디스플레이하는 경우를 생각해 보자. COUNTRYBolivia 값을 가지고 있는 엘리먼트를 정보를 필터링 할 수 있다. 이렇게 해서 tabularDatacolumns 엘리먼트 사이에 filters 태그를 추가한다.

   <filters>
     <patternFilter expression="Bolivia"
                    match="caseInsensitive unicodeCase"
                    testColumn="COUNTRY" />
   </filters>

이 애플리케이션을 재실행한다. 이제 테이블은 Bolivia와 일치하는 21개의 행만 디스플레이 할 것이다.

오름차순이나 내림차순으로 테이블을 정렬하기 위해서는 어느 열의 레이블이던 클릭만 하면 된다. filters 엘리먼트의 차일드(child)로서 다음 sorter 엘리먼트를 추가하면 프로그램적으로 데이터를 쉽게 정렬할 수도 있다:

   <sorter testColumn="TEMPERATURE" direction="descending"/>

이제 행은 온도가 가장 낮은 위치부터 온도가 가장 높은 위치까지 나타나게 될 것이다.

마무리로, 다음 highlighters 태그를 추가하여 홀수행은 남색으로 짝수행은 밝은 회색으로 나오게 한다.

    <highlighters>
      <alternateRowHighlighter oddRowBackground="cyan"
        evenRowBackground="light grey"/>
    </highlighters>

여기까지의 정보를 모두 넣으면 table.jdnc 파일은 다음과 같이 된다.

   <?xml version='1.0'?>
   <om:resource xmlns:om="http://www.openmarkup.net/2004/05/om"
     xmlns="http://www.jdesktop.org/2004/05/jdnc"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation=
       "http://www.jdesktop.org/2004/05/jdnc schema/ jdnc-1_0.xsd">

     <table>
       <tabularData source="weather.txt">
         <metaData>
           <columnMetaData name="ICAO"/>
           <columnMetaData name="STATION"/>
           <columnMetaData name="REGION"/>
           <columnMetaData name="COUNTRY"/>
           <columnMetaData name="ELEVATION" type="float"/>
           <columnMetaData name="LATITUDE" type="float"/>
           <columnMetaData name="LONGITUDE" type="float"/>
           <columnMetaData name="TIMESTAMP"/>
           <columnMetaData name="TEMPERATURE" type="float"/>
           <columnMetaData name="DEWPOINT" type="float"/>
           <columnMetaData name="HUMIDITY" type="integer"/>
           <columnMetaData name="VISIBILITY_QUAL"/>
           <columnMetaData name="VISIBILITY" type="float"/>
           <columnMetaData name="WIND_DIR"/>
           <columnMetaData name="WIND_DEG" type="integer"/>
           <columnMetaData name="WIND_SPEED" type="float"/>
           <columnMetaData name="GUST_SPEED" type="float"/>
         </metaData>
       </tabularData>
       <filters>
         <patternFilter expression="Bolivia"
                        match="caseInsensitive unicodeCase"
                        testColumn="COUNTRY"/>
         <sorter testColumn=
           "TEMPERATURE" direction="descending"/>
       </filters>
       <highlighters>
         <alternateRowHighlighter oddRowBackground="cyan"
           evenRowBackground="light grey"/>
       </highlighters>

       <columns>
         <column title="Station" binding="STATION"
               prototypeValue="Santa Cruz / El Trompillo city"/>
         <column title="Country" binding="COUNTRY"/>
         <column title="°C" binding="TEMPERATURE"
               horizontalAlignment="center"/>
         <column title="Wind Dir." binding="WIND_DIR"/>
         <column title="Wind Speed" binding="WIND_SPEED"
               horizontalAlignment="center"/>
       </columns>
     </table>

   </om:resource>

테이블은 줄무늬 행으로 표시되고, 행은 온도 기준으로 내림차순 형식으로 정렬된다.

Sorted Table

JDNC에 대한 자세한 내용은 JDNC project page를 참조하기 바란다.

"Java SE" 카테고리의 다른 글

2005/05/31 10:29 2005/05/31 10:29

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/193

댓글을 달아 주세요

  1. 박정숙  수정/삭제  댓글쓰기

    좋은 정보 감사해요~

    2007/09/19 05:24
  2. 김문경  수정/삭제  댓글쓰기

    행은 내림차순 형식으로 정렬되는군요

    2007/09/19 21:57
[로그인][오픈아이디란?]

◀ Prev 1  ... 515 516 517 518 519 520 521 522 523  ... 626  Next ▶