JNDC에서의 달력 유틸리티

Java SE 2005/08/10 10:19 Posted by Sun
2005년 5월 31일자 테크팁, "JNDC를 이용한 테이블 소개" 에서는 JDNC를 사용하여 파일로부터 탭이 분리된 데이터를 읽고 테이블에 표시해보았다. 이번 테크팁에서는 JDNC를 위한 Java API를 사용하여 단순한 달력을 생성해보도록 한다. 이 달력으로 날짜를 선택하고 한 달간의 이벤트를 보여줄 수 있다. JDNC에서 제공하는 고급 기능들이 많은데, 이번 테크팁에서는 API가 일반적인 태스크를 수행하는 것을 얼마나 더 쉽게 만들어 주는지 간단히 알아보겠다.

이번 테크팁의 예제를 실행하기 위해서는 최신 JDNC를 다운로드한다. 현재 최신 버전은 0.7이고 J2SE 5.0에서만 가능하다. jdnc-0_7-bin.zip 파일을 다운로드하여 압축을 푼다. 이번 테크팁의 예제를 위해, 디렉토리를 생성하여jdnc-0_7/lib에서 세 개의 jar 파일(jdnc-0_7-all, jdnc-runner, jlfgr-1_0)을 복사한다. 또한 복사한 세 개 파일에 대한 사용자의 클래스패스를 설정해야한다.

JDNC로 할 수 있는 가장 간단한 것부터 시작하자. 날짜를 선택하는데 사용될 컴포넌트를 추가한다. 다음과 같이 코드 한 줄로 할 수 있다. :
   frame.addComponent(new JXDatePicker());
addComponent() 메소드로 변수 프레임이JFrame이 아님을 알 수 있다. 실제로, 몇가지 기능을 추가하여JFrame을 상속받는org.jdesktop.swing.JXFrame을 사용한다. 다음의 DatePicker 프로그램은JXFrame 오브젝트를 생성하고, 새로 생성된JXDatePicker 오브젝트를 JXFrame 오브젝트에 추가한다 :
   import org.jdesktop.swing.JXDatePicker;
   import org.jdesktop.swing.JXFrame;

   public class DatePicker {

     public static void main(String[] args) {
       JXFrame frame = new JXFrame("Date");
       frame.addComponent(new JXDatePicker());
       frame.setResizable(false);
       frame.setVisible(true);
     }
   }
DatePicker를 컴파일하고 구동하면, 오늘의 날짜가 적혀있는 작은 프레임이 생길 것이다

DatePicker

이 컴포넌트의 텍스트는 편집이 가능하다. 프레임 오른쪽에 있는 버튼을 누르면 해당 월에 대한 달력정보를 얻을 수 있다. 오늘의 날짜는 사각형으로 둘러져 있다. 다른 날짜를 클릭하면 기존 날짜 대신 선택된 날짜에 사각형이 둘러진다. 버튼을 다시 클릭하면 달력이 다시 나타난다. 선택된 날짜는 회색으로 표시되고, 오늘 날짜에는 사각형으로 표시된다. 화살표 버튼을 눌러 한번에 하나씩 다른 달로 넘어갈 수 있다.

DatePicker2

날짜 창에서 오른쪽 버튼을 눌러 볼 수 있는 월(月) 정보는 org.jdesktop.swing.calendar 패키지의 컴포넌트를 이용하여 따로 볼 수도 있다. JXMonthView 클래스를 이용하여 어떤 달의 정보든 볼 수 있게 하고 사용자가 원하는 날짜의 범위를 선택할 수 있게 한다. 현재 달을 나타내는 JMXMonthView에는JXMonthView 의 독립변수 컨스트럭터가 사용되지 않는다. 현재 날짜에는 사각형이 둘러지나 다른 날은 선택되지 않는다

원하는 대로 달력의 색을 변경할 수 있다. 달력 제목의 배경색, 달력 자제의 배경색, 오늘날짜에 테두리되는 사각형의 색, 선택된 날짜에 나타나는 색이 포함된다. 또, 매주 첫 번째 날짜, 요일을 나타내는 글자(e.g. 월, 화, 수 …)의 색도 변경할 수 있다.

또한 setSelectionMode() 메소드를 통해 사용자가 선택할 수 있는 범위를 설정하는 모드를 정한다. NO_SELECTION 모드에서 사용자는 달력에서 어떤 날짜도 선택할 수 없다. 디폴트는SINGLE_SELECTION로, 사용자는 한번에 한가지 값을 변경할 수 있다. SINGLE_SELECTION으로 설정되어 있으면, 사용자 프로그램에서 날짜 범위를 지정했다고 하더라도 한 날짜만 선택되어져 보인다. MULTIPLE_SELECTION 모드에서는 사용자가 처음 날짜로부터 클릭/드래그해서 연속된 날짜를 선택할 수 있다. WEEK_SELECTION모드에서는 처음 선택한 날짜로부터 7일 이상 선택할 수 없다.

다음의 예제 프로그램,MonthView에서는 새로운JXMonthView를 생성한다. 선택된 날짜는 빨간색, 오늘의 날짜의 테두리는 녹색으로 설정한다. 여러 날짜를 선택할 수 있도록 설정되었다.
   import org.jdesktop.swing.JXFrame;
   import org.jdesktop.swing.calendar.JXMonthView;

   import java.awt.Color;

   public class MonthView extends JXFrame {

     public MonthView(){
       setResizable(false);
       JXMonthView monthView = new JXMonthView();
       monthView.setTodayBackground(Color.GREEN);
       monthView.setSelectedBackground(Color.RED);
       monthView.setSelectionMode(
         JXMonthView.MULTIPLE_SELECTION);
       addComponent(monthView);
     }

     public static void main(String[] args) {
       new MonthView().setVisible(true);
     }
   }
MonthView를 컴파일하고 구동한다. 아무 날이나 클릭하고 원하는 날까지 드래그하면 선택한 날짜들이 빨간색으로 강조되는 것을 볼 수 있을 것이다.

MonthView

다양한 방법으로 좀 더 사용자정의 해볼 수 있다. 먼저, 특정 날짜를 포함하여 보여지도록 해보자. 예를 들어, 다음과 같이 2005년 7월 15일을 포함하는 달을 생성할 수 있다 :
   todaysDate = (new GregorianCalendar(2005,
                       6, 15)).getTimeInMillis();
   monthView = new JXMonthView(todaysDate);
비록 많이 사용되지는 않겠지만 월을 0부터 시작하여 1월을 '월 0'이라고 표시되게 만들 수 이다. 즉, '월 7'은 7월이 아닌 6월이 된다. 또 어떤 날이던지 한 주의 첫번째 날로 만들 수 있다. 다음은 월요일이 한 주의 시작이 되게 할 수 있는 방법이다
   monthView.setFirstDayOfWeek(Calendar.MONDAY);
JXMonthView 클래스를 좀 더 연습해보려면, org.jdesktop.swing.calendar 패키지의 두개의 다른 클래스인,DateSpanDateUtils를 사용해야 한다. 연속되는 여러 날짜를 선택하려면 JXMonthViewsetSelectedDateSpan() 메소드를 사용하고 DateSpan 오브젝트를 전달한다. 이를 위해서는 시작하는 날짜와 끝나는 날짜를 지정할 필요가 있다. 이전과 같이 GregorianCalendar클래스를 사용하여 명확하게 날짜를 선택하여 지정할 수 있다 . 또한 DateUtils 클래스의 몇 개의 편리한 메소드를 사용하여 한 주 전과 한 주 후의 날짜와 매달 첫 날과 마지막 날을 선택할 수 있다. 다음은 DateSpanDateUtils를 사용하여 여러 날짜를 선택하는 방법을 보여준다. :
   long startDate = DateUtils.previousWeek(todaysDate);
   long endDate = DateUtils.previousDay(todaysDate);
   monthView.setSelectedBackground(Color.LIGHT_GRAY);
   monthView.setSelectionMode(JXMonthView.MULTIPLE_SELECTION);
   monthView.setSelectedDateSpan(new DateSpan(startDate, 
                                              endDate));
이에 덧붙여, 특별한 날을 표시할 수 있다. 예를 들어 휴일, 월급날, 주말을 강조하고자 한다면,
   monthView.setFlaggedDates(flaggedDates);
전달된 날짜들이 굵은 글씨로 강조된다

다음의 예제 프로그램 RangeofDates 에서는 이런 추가적인 기능을 이용한다.:
   import org.jdesktop.swing.JXFrame;
   import org.jdesktop.swing.calendar.JXMonthView;
   import org.jdesktop.swing.calendar.DateSpan;
   import org.jdesktop.swing.calendar.DateUtils;

   import java.awt.Color;
   import java.util.GregorianCalendar;
   import java.util.Calendar;

   public class RangeOfDates extends JXFrame {

     private long todaysDate;
     private JXMonthView monthView;

     RangeOfDates() {
       setResizable(false);
       setUpMonthView();
       markDateSpan();
       flagDates();
       addComponent(monthView);
     }

     private void setUpMonthView() {
       todaysDate = (new GregorianCalendar(2005,
                          6, 15)).getTimeInMillis();
       monthView = new JXMonthView(todaysDate);
       monthView.setFirstDayOfWeek(Calendar.MONDAY);
     }

     private void markDateSpan() {
       long startDate = DateUtils.previousWeek(todaysDate);
       long endDate = DateUtils.previousDay(todaysDate);
       monthView.setSelectedBackground(Color.LIGHT_GRAY);
       monthView.setSelectionMode(
         JXMonthView.MULTIPLE_SELECTION);
       monthView.setSelectedDateSpan(new DateSpan(startDate,
                                                  endDate));
     }

     private void flagDates() {
       long[] flaggedDates = {
         DateUtils.getStartOfMonth(todaysDate),
         todaysDate,
         DateUtils.getEndOfMonth(todaysDate)
       };
       monthView.setFlaggedDates(flaggedDates);

     }

     public static void main(String[] args) {
       new RangeOfDates().setVisible(true);
     }

   }

RangeOfDates를 컴파일하고 실행하면 한 주가 강조되어 있고 3일이 표시 되어있는 2005년 7월 달력이 나타난다. 이 API는 새로운 것은 아니지만 달력이 필요할 때마다 매번 같은 코드를 다시 구현하는 것을 방지해준다.

JDNC에 대한 좀 더 자세한 정보는 JDNC project page를 참고하기 바란다.

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

2005/08/10 10:19 2005/08/10 10:19

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

댓글을 달아 주세요

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

    좋은 정보 감사해요~

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

◀ Prev 1  ... 496 497 498 499 500 501 502 503 504  ... 626  Next ▶