import java.applet.Applet;
import java.awt.Button;
import java.awt.Choice;
import java.awt.Color;
import java.awt.Event;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Label;
import java.awt.TextField;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class CalendarApplet extends Applet
{
static final int TOP=70;
static final int CELLWIDTH=50,CELLHEIGHT=30;
static final int MARGIN=3;
static final int FEBRUARY=1;
TextField tfYear=new TextField("2004",5);
Choice monthChoice=new Choice();
Button btUpdate=new Button("更新");
GregorianCalendar calendar=new GregorianCalendar();
Font smallFont=new Font("TimesRoman",Font.PLAIN,15);
Font bigFont=new Font("TimesRoman",Font.BOLD,50);
String days[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
String months[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
int daysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
int searchMonth,searchYear;
 
public void init()
{
setBackground(Color.white);
searchMonth=calendar.get(Calendar.MONTH);
searchYear=calendar.get(Calendar.YEAR);
add(new Label("年:"));
tfYear.setText(String.valueOf(searchYear));
add(tfYear);
add(new Label("月:"));
monthChoice.setFont(smallFont);
for(int i=0;i<12;i++)
{
monthChoice.addItem(months[i]);//增加下拉框选项

}
monthChoice.select(searchMonth);//设置下拉框当前选项
add(monthChoice);
add(btUpdate);
int componentCount=this.getComponentCount();//得到Applet中的组件数量
for(int i=0;i<componentCount;i++)
{
getComponent(i).setFont(smallFont);

}


}

public void paint(Graphics g)
{
FontMetrics fontMetric;  //显示字体的FontMetrics对象
int fontAscent;
int dayPos;
int totalWidth,totalHeight;//总的宽度,高度
int numRows;
int xNum,yNum;
int numDays;
String dayStr;
int margin;
g.setColor(Color.lightGray);
g.setFont(bigFont);
g.drawString(searchYear+"年",60,TOP+70);
g.drawString((searchMonth+1)+"月",200,TOP+130);
g.setColor(Color.black);
g.setFont(smallFont);
fontMetric=g.getFontMetrics();  //获取初值变量
fontAscent=fontMetric.getAscent();
dayPos=TOP+fontAscent/2;
totalWidth=7*CELLWIDTH;
for(int i=0;i<7;i++)
{
g.drawString(days[i],(CELLWIDTH-fontMetric.stringWidth(days[i]))/2+i*CELLWIDTH,dayPos-20);//绘制表格标题栏
}

numRows=getNumberRows(searchYear,searchMonth);//计算所需要的行数量
totalHeight=numRows*CELLHEIGHT;
for(int i=0;i<=totalWidth;i+=CELLWIDTH)
{
   g.drawLine(i,TOP,i,TOP+totalHeight);
   
}



for(int i=0,j=TOP;i<=numRows;i++,j+=CELLHEIGHT)
{
g.drawLine(0,j,totalWidth,j);

}
xNum=(getFirstDayOfMonth(searchYear,searchMonth)+1)*CELLWIDTH-MARGIN;
yNum=TOP+MARGIN+fontAscent;
numDays=daysInMonth[searchMonth]+((calendar.isLeapYear(searchYear)&&(searchMonth==FEBRUARY))?1:0);
for(int day=1;day<=numDays;day++)
{
dayStr=Integer.toString(day);
g.drawString(dayStr,xNum-fontMetric.stringWidth(dayStr),yNum);
//绘制字符串
xNum+=CELLWIDTH;
if(xNum>totalWidth)
{
xNum=CELLWIDTH-MARGIN;
yNum+=CELLHEIGHT;

}

}
}
public boolean action(Event e,Object o)
{
int searchYearInt;
if(e.target==btUpdate)
{
searchMonth=monthChoice.getSelectedIndex();//得到查询月份
searchYearInt=Integer.parseInt(tfYear.getText(),10);
if(searchYear>1581)
{
searchYear=searchYearInt;

}
repaint();
return true;



}
return false;


}
private int getNumberRows(int year,int month)
{
//得到行数量
int firstDay;
int numCells;
if(year<1582)
{
//年份小于1582,则返回-1
return(-1);

}
if((month<0)||(month>11))
{
return(-1);

}
firstDay=getFirstDayOfMonth(year,month);

if((month==FEBRUARY)&&(firstDay==0)&&!calendar.isLeapYear(year))
{
return 4;

}
numCells=firstDay+daysInMonth[month];
if((month==FEBRUARY)&&(calendar.isLeapYear(year)))
{
numCells++;

}
return((numCells<=35)?5:6);


}
private int getFirstDayOfMonth(int year,int month)
{
int firstDay;
int i;
if(year<1582)
{
return(-1);

}
if((month<0)||(month>11))
{
return(-1);
}
firstDay=getFirstDayOfYear(year);

for(i=0;i<month;i++)
{
firstDay+=daysInMonth[i];

}

if((month>FEBRUARY)&&calendar.isLeapYear(year))
{
firstDay++;

}
return(firstDay%7);

}
private int getFirstDayOfYear(int year)
{
int leapYears;
int hundreds;
int fourHundreds;
int first;
if(year<1582)
{
return(-1);

}
leapYears=(year-1581)/4;
hundreds=(year-1501)/100;
leapYears-=hundreds;
fourHundreds=(year-1201)/400;
leapYears+=fourHundreds;
first=5+(year-1582)+leapYears%7;
return first;
}

}

解决方案 »

  1.   

    声明一下:本人不是求作业,自学中,我尝试改过,没成功,找不到原因,已下是我改的,不知道为什么运行成了那个样子
    package cn.example;import javax.swing.JFrame;
    import javax.swing.JPanel;
    import java.awt.BorderLayout;
    import java.awt.Button;
    import java.awt.Choice;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Event;
    import java.awt.EventQueue;
    import java.awt.FlowLayout;
    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Label;
    import java.awt.TextField;
    import java.util.Calendar;
    import java.util.GregorianCalendar;
    public class CalendarDemo {
    public static void main(String args[])
    {
    EventQueue.invokeLater(new Runnable()
            {
               public void run()
               {
                  JFrame frame =new launchFrame();
                  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                  frame.setVisible(true);
               }
            });
    }
    }
     class launchFrame extends JFrame {
    static final int TOP=70;
    static final int CELLWIDTH=50,CELLHEIGHT=30;
    static final int MARGIN=3;
    static final int FEBRUARY=1;
    JPanel pan1,pan2;
    TextField tfYear=new TextField("2004",5);
    Choice monthChoice=new Choice();
    Button btUpdate=new Button("更新");
    GregorianCalendar calendar=new GregorianCalendar();
    Font smallFont=new Font("TimesRoman",Font.PLAIN,15);
    Font bigFont=new Font("TimesRoman",Font.BOLD,50);
    String days[]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
    String months[]={"一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"};
    int daysInMonth[]={31,28,31,30,31,30,31,31,30,31,30,31};
    int searchMonth,searchYear;
    public launchFrame()
    {
    setTitle("Calendar");
    setBounds(0,0,600,600);

    Container container=getContentPane();
    pan1=new JPanel();
    pan2=new JPanel();
    container.add(pan1,new BorderLayout().NORTH);
    pan1.setLayout(new FlowLayout(10));

    setBackground(Color.white);
    searchMonth=calendar.get(Calendar.MONTH);
    searchYear=calendar.get(Calendar.YEAR);
    pan1.add(new Label("年:"));
    tfYear.setText(String.valueOf(searchYear));
    pan1.add(tfYear);
    pan1.add(new Label("月:"));
    monthChoice.setFont(smallFont);
    for(int i=0;i<12;i++)
    {
    monthChoice.addItem(months[i]);//增加下拉框选项

    }
    monthChoice.select(searchMonth);//设置下拉框当前选项
    pan1.add(monthChoice);
    pan1.add(btUpdate);
    int componentCount=this.getComponentCount();//得到Applet中的组件数量
    for(int i=0;i<componentCount;i++)
    {
    getComponent(i).setFont(smallFont);

    }

    }



    public void paint(Graphics g)
    {
    FontMetrics fontMetric;  //显示字体的FontMetrics对象
    int fontAscent;
    int dayPos;
    int totalWidth,totalHeight;//总的宽度,高度
    int numRows;
    int xNum,yNum;
    int numDays;
    String dayStr;
    int margin;
    g.setColor(Color.lightGray);
    g.setFont(bigFont);
    g.drawString(searchYear+"年",60,TOP+70);
    g.drawString((searchMonth+1)+"月",200,TOP+130);
    g.setColor(Color.black);
    g.setFont(smallFont);
    fontMetric=g.getFontMetrics();  //获取初值变量
    fontAscent=fontMetric.getAscent();
    dayPos=TOP+fontAscent/2;
    totalWidth=7*CELLWIDTH;
    for(int i=0;i<7;i++)
    {
    g.drawString(days[i],(CELLWIDTH-fontMetric.stringWidth(days[i]))/2+i*CELLWIDTH,dayPos-20);//绘制表格标题栏
    }

    numRows=getNumberRows(searchYear,searchMonth);//计算所需要的行数量
    totalHeight=numRows*CELLHEIGHT;
    for(int i=0;i<=totalWidth;i+=CELLWIDTH)
    {
       g.drawLine(i,TOP,i,TOP+totalHeight);
       
    }



    for(int i=0,j=TOP;i<=numRows;i++,j+=CELLHEIGHT)
    {
    g.drawLine(0,j,totalWidth,j);

    }
    xNum=(getFirstDayOfMonth(searchYear,searchMonth)+1)*CELLWIDTH-MARGIN;
    yNum=TOP+MARGIN+fontAscent;
    numDays=daysInMonth[searchMonth]+((calendar.isLeapYear(searchYear)&&(searchMonth==FEBRUARY))?1:0);
    for(int day=1;day<=numDays;day++)
    {
    dayStr=Integer.toString(day);
    g.drawString(dayStr,xNum-fontMetric.stringWidth(dayStr),yNum);
    //绘制字符串
    xNum+=CELLWIDTH;
    if(xNum>totalWidth)
    {
    xNum=CELLWIDTH-MARGIN;
    yNum+=CELLHEIGHT;

    }

    }
    }
    public boolean action(Event e,Object o)
    {
    int searchYearInt;
    if(e.target==btUpdate)
    {
    searchMonth=monthChoice.getSelectedIndex();//得到查询月份
    searchYearInt=Integer.parseInt(tfYear.getText(),10);
    if(searchYear>1581)
    {
    searchYear=searchYearInt;

    }
    repaint();
    return true;



    }
    return false;


    }
    private int getNumberRows(int year,int month)
    {
    //得到行数量
    int firstDay;
    int numCells;
    if(year<1582)
    {
    //年份小于1582,则返回-1
    return(-1);

    }
    if((month<0)||(month>11))
    {
    return(-1);

    }
    firstDay=getFirstDayOfMonth(year,month);

    if((month==FEBRUARY)&&(firstDay==0)&&!calendar.isLeapYear(year))
    {
    return 4;

    }
    numCells=firstDay+daysInMonth[month];
    if((month==FEBRUARY)&&(calendar.isLeapYear(year)))
    {
    numCells++;

    }
    return((numCells<=35)?5:6);


    }
    private int getFirstDayOfMonth(int year,int month)
    {
    int firstDay;
    int i;
    if(year<1582)
    {
    return(-1);

    }
    if((month<0)||(month>11))
    {
    return(-1);
    }
    firstDay=getFirstDayOfYear(year);

    for(i=0;i<month;i++)
    {
    firstDay+=daysInMonth[i];

    }

    if((month>FEBRUARY)&&calendar.isLeapYear(year))
    {
    firstDay++;

    }
    return(firstDay%7);

    }
    private int getFirstDayOfYear(int year)
    {
    int leapYears;
    int hundreds;
    int fourHundreds;
    int first;
    if(year<1582)
    {
    return(-1);

    }
    leapYears=(year-1581)/4;
    hundreds=(year-1501)/100;
    leapYears-=hundreds;
    fourHundreds=(year-1201)/400;
    leapYears+=fourHundreds;
    first=5+(year-1582)+leapYears%7;
    return first;
    }
    }