Jive Community Forums

 

  JavadesktopFAQ JavadesktopWIKI JavadesktopBLOG JavadesktopPROJECTS JavadesktopHOME javadotnet javadesktopFORUMS javadesktopARTICLES

Introducing JXMonthView!

A JDNC Calendar Component

by Joshua Outwater

February 22, 2005

What is it?

JXMonthView is a component that displays a monthly calendar, very similar to what you would see in applications such as “Evolution” and “Outlook”. Although many applications require the use of a calendar, most developers currently write their own solutions. It is our hope that this open source version will fill this void and allow developers to concentrate on their applications.

What can it do?

JXMonthView can display any number of months. Depending on the component orientation, months are drawn from left to right or right to left and then top to bottom. For example, the following JXMonthView component is configured to display one column and two rows.

As more drawing area is provided to the component, it adds more rows or columns. For instance, if the user horizontally stretches the above demo application, another column (two months) is added once enough space becomes available.

Four selection modes are available to determine how the user can interact with the component. Single selection allows the user to select just one day at a time, while multiple selection lets the user select any consecutive number of days. Week selection ensures that selections of over 7 days snap to a full week. A no-selection mode is useful for displaying a calendar that doesn't take input.

Applications such as calendar clients may need to flag particular days on the calendar. A list of these days can be given to the JXMonthView, which displays these days in boldface.

How do I use it?

I'm glad you asked! And I'm glad you made it this far through the article! In this section I'll describe the API available in the JXMonthView component.

Creating a JXMonthView by calling the default constructor creates an instance that displays the current month.

// Create a JXMonthView with the default constructor
JXMonthView monthView = new JXMonthView();

Another constructor takes a long specifying the time in milliseconds of the month you wish to display. To display the month of January in the year 2004, for example, you need a time in milliseconds that falls within that particular month and year. Here's some code to do just that:

// Create a calendar that has the date of January 1, 2004.
Calendar cal = Calendar.getInstance(2004, 1, 1);
// Create a new JXMonthView using the date set in the calendar.
JXMonthView monthView = new JXMonthView(cal.getTimeInMillis());

You can configure JXMonthView to display more than one month at a time by calling setPreferredCalCols or setPreferredCalRows. These methods set the preferred number of months to display in each column or row. When the preferred number of columns or rows changes, the dimensions returned from getMinimumSize and getPreferredSize are updated so the component knows the amount of space it needs to draw. The following code configures the month view to display two columns and two rows:

monthView.setPreferredCols(2);
monthView.setPreferredRows(2);

By default the first day of the week is retrieved from the Calendar class for the current locale. Using the setFirstDayOfWeek method you can make any day of the week the first day. You can also change the character representation of the days painted in the header by providing an array of strings.

// Set the first day of the week to Monday.
monthView.setFirstDayOfWeek(Calendar.MONDAY);
// Supply our own character representation of the days of the week.
// Sunday is always considered the first entry.
monthView.setDaysOfTheWeek(new String[]{"S", "M", "T", "W", "R", "F", "S"});

To flag days, you need to provide an array of longs (time in milliseconds) ordered from smallest to largest. This is useful to inform users of days that have scheduled appointments.

// Create some dates that we want to flag as being important.
Calendar cal1 = Calendar.getInstance();
cal1.set(2004, 3, 12);
Calendar cal2 = Calendar.getInstance();
cal2.set(1976, 4, 9);


long[] flaggedDates = new long[] {
    System.currentTimeMillis()
    cal1.getTimeInMillis(),
    cal2.getTimeInMillis(),
};

// Sort them in ascending order.
java.util.Arrays.sort(flaggedDates);
// Flag these dates as important.
monthView.setFlaggedDates(flaggedDates);

As we mentioned before, JXMonthView supports four modes of selection: single, multiple, week, and no selection. Once the user makes a selection, an action is fired to inform listeners that selection has changed. The following example prints out the selected date range every time the action listener is called.

// Change the selection mode to select full weeks.
monthView.setSelectionMode(JXMonthView.WEEK_SELECTION);

// Add an action listener to be notified when the user
// changes selection via the mouse.
monthView.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        System.out.println(((JXMonthView)e.getSource()).
            getSelectedDateSpan());
    }
});

How do I get it?

JXMonthView is part of JDNC. You can find JDNC downloads and source at: http://jdnc.dev.java.net.

Post a Comment