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クラスは下のソースの赤字部分のように、デフォルトコンストラクタで生成して、コンテナに貼るだけでカレンダー表示を行うことができます。
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に実行結果を示しました。
予想に反して4カ月分のカレンダーが表示されてしまいました。
実をいうと、JXMonthViewコンポーネントは表示されるサイズに応じて、表示する月数を変化させます。例えば、ウィンドウをリサイズすると図2のように表示する月数が増えます。
表示する月数がわからないというのは、ちょっと使いづらいですね。そこで、月の行数と列数を指定してみましょう。
private JXMonthView createMonthView() {
// カレンダー表示コンポーネントの生成
JXMonthView monthView = new JXMonthView();
// 表示する月の列と行を指定
monthView.setPreferredRowCount(2);
monthView.setPreferredColumnCount(1);
return monthView;
}
列と行の指定には、それぞれsetPreferredRowCountメソッド、setPreferredColumnCountメソッドを使用します(赤字部分)。
ただし、メソッド名からわかるようにあくまでもプリファードな列と行になります。このため、プリファードサイズを保持するレイアウトマネージャ(例えばFlowLayoutクラス)でないと、指定が無視されてしまいます。
図3ではFlowLayoutクラスを使って表示させてみました。