SwingXプロジェクトの紹介も今月で3回目になりました。今月も先月に引き続きSwingで提供されていない独自のコンポーネントを紹介します。

 今月取りあげるコンポーネントは、カレンダーとツリーテーブルです。どちらも使用頻度が高いコンポーネントなのですが、Swingでは提供されていませんでした。

 なお、第1回で示したSwingXプロジェクトのプロジェクトサイトが変更されました。新しいURLはこちらです。

 java.netはCollabNetをベースに作られていたのですが、現在Project Kenaiへの変更が行われています。このためjava.netでホスティングしているプロジェクトのURLが変更されています。SwingXプロジェクトもこれに伴い、新しいプロジェクトサイトに変更されたのです。

 原稿執筆時点(2011年2月末)ではSwingXプロジェクトのProject Kenaiへの移行が完了しておらず、SwingXのダウンロードがKenaiからできなくなっています。暫定措置として、テンポラリのダウンロードページからダウンロードできるようになっています。

 新しいプロジェクトページでダウンロードできるようになったら、またお知らせします。

カレンダーの表示

 ブログやスケジュール管理アプリケーションなど日付が重要なアプリケーションでよく使われるコンポーネントの一つに、カレンダーがあります。

 カレンダーはリアルな世界でも使われ続けてきたので、直感的に年月日を知るのに適しています。ところが、Swingではカレンダーを表示するコンポーネントは提供されていませんでした。

 カレンダーを表示するのは比較的簡単にできるので、Java Swing Hacksなどの書籍でも扱われています。しかし、汎用に使えるカレンダー表示コンポーネントがあるのに越したことはありません。

 SwingXプロジェクトでは、このカレンダー表示をorg.jdesktop.swingx.JXMonthViewクラスで実現しています。

JXMonthViewの使い方

 では、さっそくJXMonthViewクラスを使ってみましょう。

サンプルのソース
SimpleCalendar.java

 JXMonthViewクラスは下のソースの赤字部分のように、デフォルトコンストラクタで生成して、コンテナに貼るだけでカレンダー表示を行うことができます。

リスト1●
public class SimpleCalendar {
    public SimpleCalendar() {
        JFrame frame = new JFrame("Simple Calendar");
        frame.setSize(400, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        frame.add(createMonthView());
 
        frame.setVisible(true);
    }
 
    private JXMonthView createMonthView() {
        // カレンダー表示コンポーネントの生成
        JXMonthView monthView = new JXMonthView();
        
        return monthView;
    }
  
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new SimpleCalendar();
            }
        });
    }
}

 ではコンパイル・実行してみましょう。繰り返しになりますが、コンパイル・実行にはswing-core-1.6.2.jarファイルをクラスパスに追加する必要があります。

 図1に実行結果を示しました。

図1●SimpleCalendarの実行結果
図1●SimpleCalendarの実行結果

 予想に反して4カ月分のカレンダーが表示されてしまいました。

 実をいうと、JXMonthViewコンポーネントは表示されるサイズに応じて、表示する月数を変化させます。例えば、ウィンドウをリサイズすると図2のように表示する月数が増えます。

図2●SimpleCalendarをリサイズする
図2●SimpleCalendarをリサイズする
[画像のクリックで拡大表示]

 表示する月数がわからないというのは、ちょっと使いづらいですね。そこで、月の行数と列数を指定してみましょう。

    private JXMonthView createMonthView() {
        // カレンダー表示コンポーネントの生成
        JXMonthView monthView = new JXMonthView();
 
        // 表示する月の列と行を指定
        monthView.setPreferredRowCount(2);
        monthView.setPreferredColumnCount(1);
        
        return monthView;
    }

 列と行の指定には、それぞれsetPreferredRowCountメソッド、setPreferredColumnCountメソッドを使用します(赤字部分)。

 ただし、メソッド名からわかるようにあくまでもプリファードな列と行になります。このため、プリファードサイズを保持するレイアウトマネージャ(例えばFlowLayoutクラス)でないと、指定が無視されてしまいます。

 図3ではFlowLayoutクラスを使って表示させてみました。

図3●表示する月数の指定
図3●表示する月数の指定