黑莓开发学习入门系列,自己动手实现一个日历软件(六)
最近有点乱糟糟,还是继续写完剩下的:
根据 黑莓开发学习入门系列,自己动手实现一个日历软件(二)实现一个黑莓应用程序最基本的结构,我们真正的可以实现日历了:
新建一个工程 calender:作为日历的完整工程开始实现一个日历小程序
创建类CalendarMain.java 作为日历的入口
创建日历布局外观类:CalenderLayout.java,作为主要的日历布局
创建类CalendarMain.java 作为日历的入口
创建日历布局外观类:CalenderLayout.java,作为主要的日历布局
CalendarMain类的应该如下结构:
package
org.bulktree.calender;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
public class CalendarMain extends UiApplication {
public static void main(String[] args) {
CalendarMain theApp = new CalendarMain();
theApp.enterEventDispatcher();
}
public CalendarMain() {
MainScreen mainScreen = new MainScreen();
CalenderLayout calender = new CalenderLayout();
mainScreen.add(calender.calLayout());
pushScreen(mainScreen);
}
}
黑莓程序入口总是先实现当前的屏幕
pushScreen(mainScreen)压入当前屏幕队列,然后维护主应用程序事件线程。
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.container.MainScreen;
public class CalendarMain extends UiApplication {
public static void main(String[] args) {
CalendarMain theApp = new CalendarMain();
theApp.enterEventDispatcher();
}
public CalendarMain() {
MainScreen mainScreen = new MainScreen();
CalenderLayout calender = new CalenderLayout();
mainScreen.add(calender.calLayout());
pushScreen(mainScreen);
}
}
对于屏幕布局就很简单了:先画一个布局图
我用Excel模拟出一个日历,不同的颜色区域(当前日历红色除外),把整个日历作为分成三块,如果按照BlackBerry程序的方式,分为三个布局管理器,最上面是一个HorizontalFieldManager,日历的周那个区域也是HorizontalFieldManager,日期区域每行看成一个HorizontalFieldManager,整体看成一个VerticalFieldManager,而整个日历可看成一个VerticalFieldManager去规范里面的布局。这样一个完整的日历就出来了。具体实现如下:
package
org.bulktree.calender;
import java.util.Calendar;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
public class CalenderLayout {
private static String[] wks = { " 日 " , " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " };
private LabelField ax = null ;
public Manager calLayout() {
Manager calender = new VerticalFieldManager();
// 日历头
Manager calHeader = new HorizontalFieldManager();
Calendar cale = Calendar.getInstance();
ChineseCalendar chin = new ChineseCalendar(cale);
String calHeaderString = " 阴历: " + CalendarUtil.getCurrentYear() + " 年 " + chin.getChineseCalendarMonth() + " 月 " + chin.getChinaDayString() + " 日{ " + chin.getCyclical() + " - " + chin.getAnimalsYear() + " 年} " ;
ax = new LabelField(calHeaderString, LabelField.HCENTER);
setFont(ax, 13 , 1 );
calHeader.add(ax);
LabelField ay = new LabelField( " 阳历: " + CalendarUtil.getCurrentMonth() + " 月 " );
setFont(ay, 13 , 1 );
calHeader.add(ay);
calender.add(calHeader);
// 星期头
Manager weakHeader = new HorizontalFieldManager();
CalenderField whf = null ;
for ( int i = 0 ; i < 7 ; i ++ ) {
whf = new CalenderField(wks[i], CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1 );
setFont(whf, 15 , 1 );
weakHeader.add(whf);
}
calender.add(weakHeader);
// 日历体
int a = CalendarUtil.getWeekCurrntMonthFirstDay();
// int a = CalendarUtil.getWeekMonthFirstDay(2011, 1);
int b = CalendarUtil.getCurrentDaysOfMonth();
// int b = CalendarUtil.getDaysOfMonth(2011, 1);
Manager calBody = new HorizontalFieldManager();
calBody.setBorder( 1 , 1 , 1 , 1 );
for ( int i = 0 ; i < a; i ++ ) {
calBody.add( new CalenderField( "" , CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1 ));
}
CalenderField yac = null ;
CalenderField yc = null ;
for ( int i = 1 ; i <= b; i ++ ) {
Manager cellManger = new VerticalFieldManager();
yac = new CalenderField(i + "" , CalenderField.HCENTER, CalenderField.FOCUSABLE, 1 );
setFont(yac, 15 , 0 );
cellManger.add(yac);
Calendar cx = Calendar.getInstance();
cx.set(Calendar.DATE, i);
final ChineseCalendar chines = new ChineseCalendar(cx);
yc = new CalenderField(chines.getChinaDayString(), CalenderField.HCENTER, CalenderField.NON_FOCUSABLE, 1 );
setFont(yc, 10 , 0 );
yac.setFocusListener( new FocusChangeListener() {
public void focusChanged(Field field, int eventType) {
String text = " 阴历: " + chines.getChineseCalenderYear() + " 年 " + chines.getChineseCalendarMonth() + " 月 " + chines.getChinaDayString() + " 日{ " + chines.getCyclical() + " - " + chines.getAnimalsYear() + " 年} " ;
updateCalendarHeader(text);
}
});
if (Calendar.getInstance().get(Calendar.DATE) == i) {
setFont(yac, 15 , 1 );
setFont(yc, 10 , 1 );
}
cellManger.add(yc);
calBody.add(cellManger);
if ((i + a) % 7 == 0 ) {
calender.add(calBody);
calBody = new HorizontalFieldManager();
}
}
calender.add(calBody);
return calender;
}
/**
* 设置字体风格
* @param obj
* @param size
* @param isBlod 是否加粗, 1加粗, 0 正常
*/
private void setFont(Field obj, int size, int isBlod) {
int fontStyle = isBlod == 1 ? Font.BOLD : Font.PLAIN;
obj.setFont(Font.getDefault().derive(fontStyle, size));
}
private void updateCalendarHeader(String text) {
ax.setText(text);
}
}
import java.util.Calendar;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FocusChangeListener;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.container.HorizontalFieldManager;
import net.rim.device.api.ui.container.VerticalFieldManager;
public class CalenderLayout {
private static String[] wks = { " 日 " , " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " };
private LabelField ax = null ;
public Manager calLayout() {
Manager calender = new VerticalFieldManager();
// 日历头
Manager calHeader = new HorizontalFieldManager();
Calendar cale = Calendar.getInstance();
ChineseCalendar chin = new ChineseCalendar(cale);
String calHeaderString = " 阴历: " + CalendarUtil.getCurrentYear() + " 年 " + chin.getChineseCalendarMonth() + " 月 " + chin.getChinaDayString() + " 日{ " + chin.getCyclical() + " - " + chin.getAnimalsYear() + " 年} " ;
ax = new LabelField(calHeaderString, LabelField.HCENTER);
setFont(ax, 13 , 1 );
calHeader.add(ax);
LabelField ay = new LabelField( " 阳历: " + CalendarUtil.getCurrentMonth() + " 月 " );
setFont(ay, 13 , 1 );
calHeader.add(ay);
calender.add(calHeader);
// 星期头
Manager weakHeader = new HorizontalFieldManager();
CalenderField whf = null ;
for ( int i = 0 ; i < 7 ; i ++ ) {
whf = new CalenderField(wks[i], CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1 );
setFont(whf, 15 , 1 );
weakHeader.add(whf);
}
calender.add(weakHeader);
// 日历体
int a = CalendarUtil.getWeekCurrntMonthFirstDay();
// int a = CalendarUtil.getWeekMonthFirstDay(2011, 1);
int b = CalendarUtil.getCurrentDaysOfMonth();
// int b = CalendarUtil.getDaysOfMonth(2011, 1);
Manager calBody = new HorizontalFieldManager();
calBody.setBorder( 1 , 1 , 1 , 1 );
for ( int i = 0 ; i < a; i ++ ) {
calBody.add( new CalenderField( "" , CalenderField.RECTANGLE, CalenderField.NON_FOCUSABLE, 1 ));
}
CalenderField yac = null ;
CalenderField yc = null ;
for ( int i = 1 ; i <= b; i ++ ) {
Manager cellManger = new VerticalFieldManager();
yac = new CalenderField(i + "" , CalenderField.HCENTER, CalenderField.FOCUSABLE, 1 );
setFont(yac, 15 , 0 );
cellManger.add(yac);
Calendar cx = Calendar.getInstance();
cx.set(Calendar.DATE, i);
final ChineseCalendar chines = new ChineseCalendar(cx);
yc = new CalenderField(chines.getChinaDayString(), CalenderField.HCENTER, CalenderField.NON_FOCUSABLE, 1 );
setFont(yc, 10 , 0 );
yac.setFocusListener( new FocusChangeListener() {
public void focusChanged(Field field, int eventType) {
String text = " 阴历: " + chines.getChineseCalenderYear() + " 年 " + chines.getChineseCalendarMonth() + " 月 " + chines.getChinaDayString() + " 日{ " + chines.getCyclical() + " - " + chines.getAnimalsYear() + " 年} " ;
updateCalendarHeader(text);
}
});
if (Calendar.getInstance().get(Calendar.DATE) == i) {
setFont(yac, 15 , 1 );
setFont(yc, 10 , 1 );
}
cellManger.add(yc);
calBody.add(cellManger);
if ((i + a) % 7 == 0 ) {
calender.add(calBody);
calBody = new HorizontalFieldManager();
}
}
calender.add(calBody);
return calender;
}
/**
* 设置字体风格
* @param obj
* @param size
* @param isBlod 是否加粗, 1加粗, 0 正常
*/
private void setFont(Field obj, int size, int isBlod) {
int fontStyle = isBlod == 1 ? Font.BOLD : Font.PLAIN;
obj.setFont(Font.getDefault().derive(fontStyle, size));
}
private void updateCalendarHeader(String text) {
ax.setText(text);
}
}
package
org.bulktree.calender;
import java.util.Calendar;
/**
* 日历工具类
*
* @author Administrator
*
*/
public class CalendarUtil {
private static Calendar cal = Calendar.getInstance();
public static String getCurrentYear() {
return "" + cal.get(Calendar.YEAR);
}
public static String getCurrentMonth() {
return "" + (cal.get(Calendar.MONTH) + 1 );
}
// 返回当前月第一天的星期
public static int getWeekCurrntMonthFirstDay() {
cal = Calendar.getInstance();
return getWeekMonthFirstDay(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
}
// 返回指定月第一天的星期
public static int getWeekMonthFirstDay( int year, int month) {
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DATE, 1 );
return cal.get(Calendar.DAY_OF_WEEK) - 1 ;
}
// 返回当月天数
public static int getCurrentDaysOfMonth() {
cal = Calendar.getInstance();
return getDaysOfMonth(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
}
// 返回指定月的天数
public static int getDaysOfMonth( int year, int month) {
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month + 1 );
cal.set(Calendar.DAY_OF_MONTH, 1 );
cal.set(Calendar.DATE, cal.get(Calendar.DATE) - 1 );
return cal.get(Calendar.DAY_OF_MONTH);
}
}
import java.util.Calendar;
/**
* 日历工具类
*
* @author Administrator
*
*/
public class CalendarUtil {
private static Calendar cal = Calendar.getInstance();
public static String getCurrentYear() {
return "" + cal.get(Calendar.YEAR);
}
public static String getCurrentMonth() {
return "" + (cal.get(Calendar.MONTH) + 1 );
}
// 返回当前月第一天的星期
public static int getWeekCurrntMonthFirstDay() {
cal = Calendar.getInstance();
return getWeekMonthFirstDay(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
}
// 返回指定月第一天的星期
public static int getWeekMonthFirstDay( int year, int month) {
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month);
cal.set(Calendar.DATE, 1 );
return cal.get(Calendar.DAY_OF_WEEK) - 1 ;
}
// 返回当月天数
public static int getCurrentDaysOfMonth() {
cal = Calendar.getInstance();
return getDaysOfMonth(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH));
}
// 返回指定月的天数
public static int getDaysOfMonth( int year, int month) {
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, month + 1 );
cal.set(Calendar.DAY_OF_MONTH, 1 );
cal.set(Calendar.DATE, cal.get(Calendar.DATE) - 1 );
return cal.get(Calendar.DAY_OF_MONTH);
}
}
package
org.bulktree.calender;
import java.util.Calendar;
public class ChineseCalendar {
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = { " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " , " 七 " , " 八 " , " 九 " , " 十 " , " 十一 " , " 十二 " };
final static long [] lunarInfo = new long []
{ 0x04bd8 , 0x04ae0 , 0x0a570 , 0x054d5 , 0x0d260 , 0x0d950 , 0x16554 , 0x056a0 , 0x09ad0 , 0x055d2 ,
0x04ae0 , 0x0a5b6 , 0x0a4d0 , 0x0d250 , 0x1d255 , 0x0b540 , 0x0d6a0 , 0x0ada2 , 0x095b0 , 0x14977 ,
0x04970 , 0x0a4b0 , 0x0b4b5 , 0x06a50 , 0x06d40 , 0x1ab54 , 0x02b60 , 0x09570 , 0x052f2 , 0x04970 ,
0x06566 , 0x0d4a0 , 0x0ea50 , 0x06e95 , 0x05ad0 , 0x02b60 , 0x186e3 , 0x092e0 , 0x1c8d7 , 0x0c950 ,
0x0d4a0 , 0x1d8a6 , 0x0b550 , 0x056a0 , 0x1a5b4 , 0x025d0 , 0x092d0 , 0x0d2b2 , 0x0a950 , 0x0b557 ,
0x06ca0 , 0x0b550 , 0x15355 , 0x04da0 , 0x0a5d0 , 0x14573 , 0x052d0 , 0x0a9a8 , 0x0e950 , 0x06aa0 ,
0x0aea6 , 0x0ab50 , 0x04b60 , 0x0aae4 , 0x0a570 , 0x05260 , 0x0f263 , 0x0d950 , 0x05b57 , 0x056a0 ,
0x096d0 , 0x04dd5 , 0x04ad0 , 0x0a4d0 , 0x0d4d4 , 0x0d250 , 0x0d558 , 0x0b540 , 0x0b5a0 , 0x195a6 ,
0x095b0 , 0x049b0 , 0x0a974 , 0x0a4b0 , 0x0b27a , 0x06a50 , 0x06d40 , 0x0af46 , 0x0ab60 , 0x09570 ,
0x04af5 , 0x04970 , 0x064b0 , 0x074a3 , 0x0ea50 , 0x06b58 , 0x055c0 , 0x0ab60 , 0x096d5 , 0x092e0 ,
0x0c960 , 0x0d954 , 0x0d4a0 , 0x0da50 , 0x07552 , 0x056a0 , 0x0abb7 , 0x025d0 , 0x092d0 , 0x0cab5 ,
0x0a950 , 0x0b4a0 , 0x0baa4 , 0x0ad50 , 0x055d9 , 0x04ba0 , 0x0a5b0 , 0x15176 , 0x052b0 , 0x0a930 ,
0x07954 , 0x06aa0 , 0x0ad50 , 0x05b52 , 0x04b60 , 0x0a6e6 , 0x0a4e0 , 0x0d260 , 0x0ea65 , 0x0d530 ,
0x05aa0 , 0x076a3 , 0x096d0 , 0x04bd7 , 0x04ad0 , 0x0a4d0 , 0x1d0b6 , 0x0d250 , 0x0d520 , 0x0dd45 ,
0x0b5a0 , 0x056d0 , 0x055b2 , 0x049b0 , 0x0a577 , 0x0a4b0 , 0x0aa50 , 0x1b255 , 0x06d20 , 0x0ada0 };
// ====== 传回农历 y年的总天数
final private static int yearDays( int y) {
int i, sum = 348 ;
for (i = 0x8000 ; i > 0x8 ; i >>= 1 ) {
if ((lunarInfo[y - 1900 ] & i) != 0 ) sum += 1 ;
}
return (sum + leapDays(y));
}
// ====== 传回农历 y年闰月的天数
final private static int leapDays( int y) {
if (leapMonth(y) != 0 ) {
if ((lunarInfo[y - 1900 ] & 0x10000 ) != 0 )
return 30 ;
else
return 29 ;
} else
return 0 ;
}
// ====== 传回农历 y年闰哪个月 1-12 ,&nb#
import java.util.Calendar;
public class ChineseCalendar {
private int year;
private int month;
private int day;
private boolean leap;
final static String chineseNumber[] = { " 一 " , " 二 " , " 三 " , " 四 " , " 五 " , " 六 " , " 七 " , " 八 " , " 九 " , " 十 " , " 十一 " , " 十二 " };
final static long [] lunarInfo = new long []
{ 0x04bd8 , 0x04ae0 , 0x0a570 , 0x054d5 , 0x0d260 , 0x0d950 , 0x16554 , 0x056a0 , 0x09ad0 , 0x055d2 ,
0x04ae0 , 0x0a5b6 , 0x0a4d0 , 0x0d250 , 0x1d255 , 0x0b540 , 0x0d6a0 , 0x0ada2 , 0x095b0 , 0x14977 ,
0x04970 , 0x0a4b0 , 0x0b4b5 , 0x06a50 , 0x06d40 , 0x1ab54 , 0x02b60 , 0x09570 , 0x052f2 , 0x04970 ,
0x06566 , 0x0d4a0 , 0x0ea50 , 0x06e95 , 0x05ad0 , 0x02b60 , 0x186e3 , 0x092e0 , 0x1c8d7 , 0x0c950 ,
0x0d4a0 , 0x1d8a6 , 0x0b550 , 0x056a0 , 0x1a5b4 , 0x025d0 , 0x092d0 , 0x0d2b2 , 0x0a950 , 0x0b557 ,
0x06ca0 , 0x0b550 , 0x15355 , 0x04da0 , 0x0a5d0 , 0x14573 , 0x052d0 , 0x0a9a8 , 0x0e950 , 0x06aa0 ,
0x0aea6 , 0x0ab50 , 0x04b60 , 0x0aae4 , 0x0a570 , 0x05260 , 0x0f263 , 0x0d950 , 0x05b57 , 0x056a0 ,
0x096d0 , 0x04dd5 , 0x04ad0 , 0x0a4d0 , 0x0d4d4 , 0x0d250 , 0x0d558 , 0x0b540 , 0x0b5a0 , 0x195a6 ,
0x095b0 , 0x049b0 , 0x0a974 , 0x0a4b0 , 0x0b27a , 0x06a50 , 0x06d40 , 0x0af46 , 0x0ab60 , 0x09570 ,
0x04af5 , 0x04970 , 0x064b0 , 0x074a3 , 0x0ea50 , 0x06b58 , 0x055c0 , 0x0ab60 , 0x096d5 , 0x092e0 ,
0x0c960 , 0x0d954 , 0x0d4a0 , 0x0da50 , 0x07552 , 0x056a0 , 0x0abb7 , 0x025d0 , 0x092d0 , 0x0cab5 ,
0x0a950 , 0x0b4a0 , 0x0baa4 , 0x0ad50 , 0x055d9 , 0x04ba0 , 0x0a5b0 , 0x15176 , 0x052b0 , 0x0a930 ,
0x07954 , 0x06aa0 , 0x0ad50 , 0x05b52 , 0x04b60 , 0x0a6e6 , 0x0a4e0 , 0x0d260 , 0x0ea65 , 0x0d530 ,
0x05aa0 , 0x076a3 , 0x096d0 , 0x04bd7 , 0x04ad0 , 0x0a4d0 , 0x1d0b6 , 0x0d250 , 0x0d520 , 0x0dd45 ,
0x0b5a0 , 0x056d0 , 0x055b2 , 0x049b0 , 0x0a577 , 0x0a4b0 , 0x0aa50 , 0x1b255 , 0x06d20 , 0x0ada0 };
// ====== 传回农历 y年的总天数
final private static int yearDays( int y) {
int i, sum = 348 ;
for (i = 0x8000 ; i > 0x8 ; i >>= 1 ) {
if ((lunarInfo[y - 1900 ] & i) != 0 ) sum += 1 ;
}
return (sum + leapDays(y));
}
// ====== 传回农历 y年闰月的天数
final private static int leapDays( int y) {
if (leapMonth(y) != 0 ) {
if ((lunarInfo[y - 1900 ] & 0x10000 ) != 0 )
return 30 ;
else
return 29 ;
} else
return 0 ;
}
// ====== 传回农历 y年闰哪个月 1-12 ,&nb#