Stringstr=i<=9?
"0"+i:
i+"";
labelDays[begin+i-2+7].setText(str);
if(currentDay==i){
labelDays[begin+i-2+7].setForeground(Color.blue);
}
}
}
3.流程图
4.程序的主要类,和说明:
1,日期类CalendarAction
void
changeMonth(java.lang.String month)
改变月份
void
changeYear(java.lang.String year)
改变年份
java.util.Calendar
getCal()
UIinterface
getUi()
void
setCal(java.util.Calendar cal)
void
setUi(UIinterface ui)
void
updateCalendar()
packagecom.calendar.action;
importcom.calendar.ui.*;
importjava.util.Calendar;
importjava.util.GregorianCalendar;
/**
*处理整个万年历中的日历操作
*@authorChen
*
*/
publicclassCalendarAction{
privateCalendarcal;
privateUIinterfaceui;
publicCalendarAction(){
cal=Calendar.getInstance();//获得程序启动时间
ui=newFrameUi(this);
updateCalendar();
}
/**
*改变年份
*@paramyear
*/
publicvoidchangeYear(Stringyear){
cal.set(Calendar.YEAR,Integer.parseInt(year));
updateCalendar();
}
/**
*改变月份
*@parammonth
*/
publicvoidchangeMonth(Stringmonth){
cal.set(Calendar.MONTH,Integer.parseInt(month)-1);
updateCalendar();
}
publicvoidupdateCalendar(){
//添加输出功能,更新界面
//获得当前月最大的天
intmaxDay=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//获得当前月第一天是当前周的第几天?
Calendarc=newGregorianCalendar();
c.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),1);
intbegin=c.get(Calendar.DAY_OF_WEEK);//*******************//
//获得当前天是当前月的第几天
//?
intcurrentDay=cal.get(Calendar.DAY_OF_MONTH);
//
ui.setCalendar(maxDay,currentDay,begin);
}
publicCalendargetCal(){
returncal;
}
publicvoidsetCal(Calendarcal){
this.cal=cal;
}
publicUIinterfacegetUi(){
returnui;
}
publicvoidsetUi(UIinterfaceui){
this.ui=ui;
}
}
2,接口UIinterface
接口UIinterface
所有已知实现类:
FrameUi
publicinterfaceUIinterface
方法摘要
void
initView()
void
setCalendar(int maxDay,int currentDay,int begin)
void
showView()
packagecom.calendar.ui;
publicinterfaceUIinterface{
publicvoidinitView();
publicvoidshowView();
publicvoidsetCalendar(intmaxDay,intcurrentDay,intbegin);
}
3,面板类:
FrameUi
构造方法摘要
FrameUi(CalendarAction action)
方法摘要
void
initView()
void
setCalendar(int maxDay,int currentDay,int begin)
void
showView()
packagecom.calendar.ui;
importcom.calendar.action.*;
importjavax.swing.*;
importjava.awt.*;
importjava.awt.event.*;
importjava.util.Calendar;
@SuppressWarnings("serial")
publicclassFrameUiextendsJFrameimplementsUIinterface{
privateintWIDTH=500;
privateintHEIGHT=400;
privateJPanelcontentPane;//主面板
privateJPanelnorthPane;//放按钮面板的面板
privateJPanelcenterPane;//中间日期面板
privateJPanelbuttonPane;//按钮面板
privateJButtonlabelYear,labelMonth;//用来显示文字,年份月份
privateJButtonbuttonPreYear,buttonNextYear;//上一年,下一年按钮
privateJButtonbuttonPreMonth,buttonNextMonth;//上一月,下一月
privateJComboBoxboxYear,boxMonth;//年月下拉列表
privateJLabel[]labelDays;
privateCalendarActionaction;//包含日历逻辑的action对象引用
publicFrameUi(CalendarActionaction){
this.action=action;
initView();
}
publicvoidinitView(){
//设置frame
this.setTitle("日历");
this.setSize(WIDTH,HEIGHT);
//初始化主控件
initContentPane();//封装初始化主控件操作
this.setContentPane(contentPane);
//设置窗体的位置
Dimensiond=Toolkit.getDefaultToolkit().getScreenSize();
intscreeWidth=d.width;
intscreeHeight=d.height;
this.setLocation((screeWidth-this.WIDTH)/2,(screeHeight-this.HEIGHT)/2);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);//改变窗体的大小
}
/**
*初始化主控件
*/
privatevoidinitContentPane(){
contentPane=newJPanel(newBorderLayout());//创建具有指定布局的JPanel
northPane=newJPanel(newBorderLayout());
centerPane=newJPanel(newGridLayout(7,7));//设置面板为七行七列
buttonPane=newJPanel();//flowLayout()
//
labelYear=newJButton("年份:
");
labelMonth=newJButton("月份:
");
buttonPreYear=newJButton("<<");//上一年
buttonNextYear=newJButton(">>");//下一年
buttonPreMonth=newJButton("<<");//上一月
buttonNextMonth=newJButton(">>");//下一月
boxYear=newJComboBox();
initBoxYear();//封装了给下拉列表赋值的操作
boxMonth=newJComboBox();
initBoxMonth();
//把按钮放到了按钮面板里northPanel
buttonPane.add(labelYear);
buttonPane.add(buttonPreYear);
buttonPane.add(boxYear);
buttonPane.add(buttonNextYear);
buttonPane.add(labelMonth);
buttonPane.add(buttonPreMonth);
buttonPane.add(boxMonth);
buttonPane.add(buttonNextMonth);
//把按钮面板放到了northPane
northPane.add(buttonPane,BorderLayout.CENTER);
//完成centerPanel
//初始化放日期的label
labelDays=newJLabel[49];
for(inti=0;ilabelDays[i]=newJLabel("",JLabel.CENTER);//label里面的文字居中
centerPane.add(labelDays[i]);
}
//把northPanel和centerPane放到主面板里面
contentPane.add(northPane,BorderLayout.NORTH);
contentPane.add(centerPane,BorderLayout.CENTER);
//给年份下拉列表添加事件给
boxYear.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringyear=boxYear.getSelectedItem().toString();
action.changeYear(year);
}
});
boxMonth.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
Stringmonth=boxMonth.getSelectedItem().toString();
action.changeMonth(month);
}
});
buttonPreYear.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
intresetYear=Integer.parseInt(boxYear.getSelectedItem().toString())-1;
if(resetYear<1){
resetYear=9999;
}
boxYear.setSelectedIndex(resetYear-1);
//action.changeYear(resetYear+"");
}
});
buttonNextYear.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
intresetYear=Integer.parseInt(boxYear.getSelectedItem().toString())-1;
if(resetYear>=9999){
resetYear=0;
}
boxYear.setSelectedIndex(resetYear+1);
//action.changeYear(resetYear+"");
}
});
buttonPreMonth.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
//获得改变后的月
intresetMonth=Integer.parseInt(boxMonth.getSelectedItem().toString())-1;
if(resetMonth<1){
resetMonth=12;
//按一下改变上一年的操作,就能同时完成改变年的下拉列表
buttonPreYear.doClick();
}
//修改下拉列表
boxMonth.setSelectedIndex(resetMonth-1);
//修改日历的月
action.changeMonth(resetMonth+"");
}
});
buttonNextMonth.addActionListener(newActionListener(){
publicvoidactionPerformed(ActionEvente){
intresetMonth=Integer.parseInt(boxMonth.getSelectedItem().toString())-1;
if(resetMonth>=11){
resetMonth=-1;
//按一下改变上一年的操作,就能同时完成改变年的下拉列表
buttonNextYear.doClick();
}
boxMonth.setSelectedIndex(resetMonth+1);
//System.out.println(resetMonth);
//action.changeMonth(resetMonth+"");
}
});
}
/**
*封装给年份下拉列表赋值的操作
*/
privatevoidinitBoxYear(){
for