カレンダーを表示する〜スケジュール管理ソフトをS!アプリで作ってみよう(その5)

今回から、スケジュール管理ソフトの開発らしい内容にしていく。今後の方針としては、まず動くものを簡単に作ってみて、それに対して手直し(リファクタリング)を加えたり、機能を追加しながら、常に動く状態にしながら開発していく。

なので、プログラムの書き直しが頻繁に発生する。ただ、Eclipseリファクタリング機能は充実しているので、それ程、苦にはならないと思う。

まず最初に、カレンダーの表示を行う事にする。カレンダーの表示と言っても、単純に今月の日付を月間カレンダーっぽく表示するだけである。曜日の表示や枠線などの飾り気が全くないものである。

プロジェクトの作成

プロジェクトを作成する。

  1. プロジェクト名は「Scheduler」とする。
  2. ベンダー名は「Ettem」、MIDletクラス名は「Scheduler」とする。
  3. MIDlet設定でMIDlet-1を「Scheduler,,com.ettem.scheduler.Scheduler」、その他の設定に「MIDxlet-ScreenSize: 480,520」と記述しておく
  4. Javaクラスのダイアログでは、パッケージは「com.ettem.scheduler」とする。

プログラムの作成

Scheduler.javaを以下のように編集する。このクラスはCanvasを生成するのと、[Exit]ボタンが押された時に終了する処理をするだけである。


/* 今月の月間カレンダーを表示する。
* Calendarクラスを使用
* (必ず31日まで表示しようとする。)
* Create at 2007-1-24.
*/
package com.ettem.scheduler;

import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class Scheduler extends MIDlet implements CommandListener {
private Command exitCommand;
private CalCanvas calCanvas;

public Scheduler() {
exitCommand = new Command("Exit", Command.EXIT, 1);
calCanvas = new CalCanvas();
calCanvas.addCommand(exitCommand);
calCanvas.setCommandListener(this);
}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

protected void pauseApp() {

}

protected void startApp() throws MIDletStateChangeException {
Display.getDisplay(this).setCurrent(calCanvas);
}

public void commandAction(Command command, Displayable display) {
if (command == exitCommand) {
try {
destroyApp(false);
notifyDestroyed();
} catch (MIDletStateChangeException e) {

}
}
}
}


CalCanvasというCanvasクラスを継承したクラスとして作成する。パッケージは、com.ettem.schedulerとしておく。作成したクラスファイルを以下のように編集する。


package com.ettem.scheduler;

import java.util.Calendar;

import javax.microedition.lcdui.*;

public class CalCanvas extends Canvas {
private Calendar now;

public CalCanvas() {
now = Calendar.getInstance();
}

protected void paint(Graphics graphics) {
Calendar firstInMonth; // その月の最初の日

// その月の最初の日を求める
firstInMonth = Calendar.getInstance();
firstInMonth.setTime(now.getTime());
firstInMonth.set(Calendar.DAY_OF_MONTH, 1);

// フォントの設定
Font font = Font.getFont(Font.FACE_SYSTEM, Font.STYLE_BOLD,
Font.SIZE_SMALL);
graphics.setFont(font);

// 日にちのセルのサイズを求める
int dayWidth = getWidth() / 8;
int dayHeight = font.getHeight();

int x = 0, y = 0; // 日にちの描画位置

for (int i = 1, tmpDayOfWeek = firstInMonth.get(Calendar.DAY_OF_WEEK);
i < 32; i++, tmpDayOfWeek++) {
if (tmpDayOfWeek > 7) {
tmpDayOfWeek = 1;
y += dayHeight;
}

x = tmpDayOfWeek * dayWidth;
graphics.drawString(String.valueOf(i), x, y,
Graphics.TOP|Graphics.LEFT);
}
}
}

これを足がかりにして、機能追加をしていってスケジュール管理ソフトらしくしていく。