もう少しまともなカレンダー表示〜スケジュール管理ソフトを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日まで表示してしまう。次回は、この部分を改善する。