もう少しまともなカレンダー表示〜スケジュール管理ソフトをS!アプリで作ってみよう(その6)

前回は、カレンダーもどきを表示させた。ただ、今月の分のみ表示が出来ただけだった。

今回は、[#]キーで翌月、[*]キーで前月に移動できるようにする。

CalCanvasクラスを以下のように修正する。


package com.ettem.scheduler;

import java.util.Calendar;

import javax.microedition.lcdui.*;

public class CalCanvas extends Canvas {
private Calendar now;
private Calendar dateToDisplay;

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

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

// 描画前に白で画面をクリアする。
graphics.setColor(0xFFFFFF);
graphics.fillRect(0, 0, getWidth(), getHeight());

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

// 色を黒に戻す。
graphics.setColor(0x000000);
// フォントの設定
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);
}
}

protected void keyPressed(int keyCode) {
Calendar dateTmp = Calendar.getInstance();

switch (keyCode) {

// "*"キーが押されたら、1ヶ月前に戻る。
case KEY_STAR:
dateTmp.setTime(dateToDisplay.getTime());
dateTmp.set(Calendar.MONTH,
dateToDisplay.get(Calendar.MONTH) - 1);
dateTmp.getTime();
if (dateTmp.get(Calendar.MONTH) ==
dateToDisplay.get(Calendar.MONTH)) {
dateTmp.set(Calendar.DAY_OF_MONTH, 0);
}
break;

// "#"キーが押されたら、1ヶ月先に進む。
case KEY_POUND:
dateTmp.setTime(dateToDisplay.getTime());
dateTmp.set(Calendar.MONTH,
dateToDisplay.get(Calendar.MONTH) + 1);
if (dateTmp.get(Calendar.MONTH) >
dateToDisplay.get(Calendar.MONTH) + 1) {
dateTmp.set(Calendar.DAY_OF_MONTH, 0);
}
break;
}

dateToDisplay = dateTmp;
repaint();
}
}

これで、表示する月を変更できるようになった。でも相変わらず、2月なのに31日まで表示してしまう。次回は、この部分を改善する。