// cal.java, V1.0 // Sunday, Nov. 19, 2000, by Yamin Li, yamin@k.hosei.ac.jp // Uptated Monday, June 28, 2005: add Buttons. // Free to use, modify, and distribute. import javax.swing.*; import javax.swing.text.*; import javax.swing.event.*; import java.awt.*; import java.applet.Applet; import java.awt.event.*; import java.util.Calendar; public class cal extends JApplet implements ActionListener{ private Button b_prev, b_next; private TextField inputYear; private int daysPerMonth[]={ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; private int year; private String month[]={ " January ", "February ", " March ", " April ", " May ", " June ", " July ", " August ", "September", " October ", "November ", "December "}; private String day[]={"Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"}; private int[][][] date; private Image displayBuffer; private Graphics drawingBuffer; public void init(){ date=new int[12][7][6]; Calendar calendar=Calendar.getInstance(); year=calendar.get(Calendar.YEAR); inputYear=new TextField(Integer.toString(year)); inputYear.addActionListener(this); b_prev=new Button( " Previous year " ); b_prev.addActionListener(this); b_next=new Button( " Next year " ); b_next.addActionListener(this); Panel yearPanel=new Panel(); yearPanel.setLayout(new BorderLayout()); yearPanel.add(b_prev, BorderLayout.WEST); yearPanel.add(inputYear, BorderLayout.CENTER); yearPanel.add(b_next, BorderLayout.EAST); displayBuffer=createImage(600, 400); drawingBuffer=displayBuffer.getGraphics(); getContentPane().add("North",yearPanel); execute(); } public void paint(Graphics g){ drawingBuffer.setColor(new Color(0x1f, 0xbf, 0xaf)); drawingBuffer.fill3DRect(0, 0, 600, 400, true); if ((year<=0)||(year>9999)){ drawingBuffer.setFont(new Font("Sansserif", Font.BOLD, 60)); drawingBuffer.setColor(Color.red); drawingBuffer.drawString("use 1-9999", 20, 100); g.drawImage(displayBuffer, 0, 0, this); return; } drawingBuffer.setFont(new Font("Monospaced", Font.PLAIN, 12)); for (int i=0; i<12; i++){ drawingBuffer.setColor(Color.blue); drawingBuffer.drawString(month[i], (i%4)*150+50, (i/4)*120+50); for (int j=0; j<7; j++){ drawingBuffer.setColor(j==0?Color.red:Color.orange); drawingBuffer.drawString(day[j], (i%4)*150+j*20+10, (i/4)*120+70); for (int k=0; k<6; k++){ drawingBuffer.setColor(j==0?Color.red:Color.black); drawingBuffer.drawString(intToString(date[i][j][k]), (i%4)*150+j*20+10, (i/4)*120+90+k*12); } } } g.drawImage(displayBuffer, 0, 0, this); } public void update(Graphics g){ paint(g); } public String intToString(int value){ if (value==0) return(" "); String v=Integer.toString(value); if (value>9) return(v); else return(" "+v); } public void execute(){ int[] firstDay=new int[12]; for (int i=0; i<12; i++){ for (int j=0; j<7; j++){ for (int k=0; k<6; k++){ date[i][j][k]=0; } } } if (year>1752){ daysPerMonth[1]=(((year%4)==0 && (year%100)!=0)||((year%400)==0))?29:28; firstDay[0]=((year-1)+(int)((year-1)/4)-(int)((year-1)/100)+(int)((year-1)/400)+1)%7; }else{ daysPerMonth[1]=((year%4)==0)?29:28; firstDay[0]=((year-1)+(int)((year-1)/4)+6)%7; } daysPerMonth[8]=year==1752?19:30; for (int i=1; i<12; i++) firstDay[i]=(firstDay[i-1]+daysPerMonth[i-1])%7; for (int i=0; i<12; i++){ for (int j=1; j<=daysPerMonth[i]; j++){ if ((year==1752)&&(i==8)&&(j>2)) date[i][(j-1+firstDay[i])%7][(j-1+firstDay[i])/7]=j+11; else date[i][(j-1+firstDay[i])%7][(j-1+firstDay[i])/7]=j; } } repaint(); } public void actionPerformed(ActionEvent e){ if (e.getSource() == inputYear){ year=Integer.parseInt(inputYear.getText()); execute(); } else { if (e.getSource() == b_next){ year++; inputYear.setText(Integer.toString(year)); execute(); } else { if (e.getSource() == b_prev){ --year; inputYear.setText(Integer.toString(year)); execute(); } } } } }