下面是一本書上的java行事曆程式代碼。很具有實用性。
package example;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Font;;
/**
* 行事曆程式
*/
public class CalenderTrain extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
//月份和年份的下拉式清單方塊
private JComboBox MonthBox=new JComboBox();
private JComboBox YearBox=new JComboBox();
//月份和年份的標籤
private JLabel YearLabel=new JLabel("年份: ");
private JLabel MonthLabel=new JLabel("月份:");
//“查看”和“今天”兩個按鈕
private JButton button_ok=new JButton("查 看");
private JButton button_today=new JButton("今 天");
//擷取今天的日期,年份,月份
private Date now_date=new Date();
private int now_year=now_date.getYear()+1900;
private int now_month=now_date.getMonth();
private boolean todayFlag=false; //是否顯示今天的日期
//用一組按鈕顯示日期,一共7行7列,第一行為星期的名字
private JButton[] button_day=new JButton[42];
private final String[] week={"日","一","二","三","四","五","六"};
private JButton[] button_week=new JButton[7];
private String year_int=null; //儲存使用者選擇的年份
private int month_int; //儲存使用者選擇的月份
/**
* 建構函式
*/
public CalenderTrain(){
super();
System.out.print(now_month);
this.setTitle("日 曆"); //設定標題
this.init();
this.setLocation(500,300);
this.setResizable(true);//設定面板的大小不能變化
pack();
}
/**
*
* 初始化日曆
*/
private void init(){
Font font=new Font("Dialog",Font.BOLD,14);
YearLabel.setFont(font);
MonthLabel.setFont(font);
button_ok.setFont(font);
button_today.setFont(font);
//設定年份區間,為當前年份的過去10年到當前年份的未來20年
for(int i=now_year-10;i<=now_year+20;i++){
YearBox.addItem(i+"");
}
//設定年份下拉式清單為當前年份,當前年份處於第10項
YearBox.setSelectedIndex(10);
//設定月份區間,12個月
for(int i=1;i<=12;i++){
MonthBox.addItem(i+"");
}
//設定月份下拉式清單為當前月份
MonthBox.setSelectedIndex(now_month);
//放置下拉式清單方塊和控制按鈕的面板
JPanel panel_ym=new JPanel();
panel_ym.add(YearLabel);
panel_ym.add(YearBox);
panel_ym.add(MonthLabel);
panel_ym.add(MonthBox);
panel_ym.add(button_ok);
panel_ym.add(button_today);
//為兩個按鈕添加事件監聽器
button_ok.addActionListener(this);
button_today.addActionListener(this);
JPanel panel_day=new JPanel();//放置日期面板
//網格布局管理器,7行7列,網格之間水平和垂直方向間均為5
panel_day.setLayout(new GridLayout(7,7,3,3));
//添加星期的名字,並放到面板裡面
for(int i=0;i<7;i++){
button_week[i]=new JButton(" ");
button_week[i].setText(week[i]);
button_week[i].setForeground(Color.black);
panel_day.add(button_week[i]);
}
button_week[0].setForeground(Color.red);
button_week[6].setForeground(Color.red);
//添加日期,放到面板裡面
for(int i=0;i<42;i++){
button_day[i]=new JButton(" ");
panel_day.add(button_day[i]);
}
this.paintDay();//顯示當前年月的日期
JPanel panel_main=new JPanel();//放置以上兩個面板
//邊界布局管理器
panel_main.setLayout(new BorderLayout());
panel_main.add(panel_day,BorderLayout.SOUTH);
panel_main.add(panel_ym,BorderLayout.NORTH);
getContentPane().add(panel_main);
}
/**顯示當前年月的日期*/
private void paintDay(){
if(this.todayFlag){
//要求顯示今天的日期
year_int=now_year+"";
month_int=now_month;
}else{
//否者,從下拉框中擷取使用者的年月
year_int=YearBox.getSelectedItem().toString();
month_int=MonthBox.getSelectedIndex();//被選的序號
}
int year_sel=Integer.parseInt(year_int)-1900;//獲得年份置
Date firstDay=new Date(year_sel,month_int,1);//構造該月的第一天
GregorianCalendar cal=new GregorianCalendar();//建立一個Calendar的執行個體
cal.setTime(firstDay);
int days=0;//存放某個月份的天數
int day_week=0;//存放某個月份的第一天是星期幾的數值
//判斷是幾月份,根據它來設定day的值,其中二月份要判斷是否是閏年
if(month_int==0||month_int==2||month_int==4||month_int==6||month_int==7
||month_int==9||month_int==11){
days=31;
}else if(month_int==3||month_int==5||month_int==8||month_int==10){
days=30;
}else{
//二月,如果是閏年,則有29天,否則有28天
if(cal.isLeapYear(year_sel)){
days=29;
}else{
days=28;
}
}
//getDay方法擷取該天是星期幾
day_week= firstDay.getDay();
int count=1;
/**
* 繪製按鈕。在這裡首先要根據選定的月份的第一天是星期幾來確定繪製按鈕的起始位置
* 其中day_week就是我們要繪製的起始位置,對於那些沒有數值可以顯示的按鈕要置空
*/
for(int i=day_week;i<day_week+days;count++,i++){
if(i%7==0||i==6||i==13||i==20||i==27||i==34||i==41){
//如果是邊界上的按鈕,文字用紅色,以來標示周末
if(i==day_week+now_date.getDate()-1){
//將與今天一樣的日期用藍色標示
button_day[i].setForeground(Color.blue);
button_day[i].setText(count+"");
}else{
//其它 邊界上的按鈕中的文字用紅色
button_day[i].setForeground(Color.red);
button_day[i].setText(count+"");
}
}else{
if(i==day_week+now_date.getDate()-1){
//將與今天一樣的日期用藍色標示
button_day[i].setForeground(Color.blue);
button_day[i].setText(count+"");
}else{
//一般位置的按鈕上的文字用黑色標示
button_day[i].setForeground(Color.black);
button_day[i].setText(count+"");
}
}
}
//對於沒有日期數值顯示的按鈕進行置空處理
if(day_week==0){
//如果第一天是周日,則將後米啊的按鈕上的文字都設為空白
for(int i=days;i<42;i++){
button_day[i].setText(" ");
}
}else{
//如果第一天不是周日,則將第一天前面的按鈕置空
for(int i=0;i<day_week;i++){
button_day[i].setText(" ");
}
}
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button_ok){
//如果單擊“查看”按鈕就調用setDay()重新方法繪製按鈕
this.todayFlag=false;
this.paintDay();
}else if(e.getSource()==button_today){
//如果單擊“今天”按鈕,得到今天的日期
todayFlag=true;
YearBox.setSelectedIndex(10);
MonthBox.setSelectedIndex(now_month);
this.paintDay();
}
}
/**
* @param args
*/
public static void main(String[] args) {
CalenderTrain ct=new CalenderTrain();
ct.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ct.setVisible(true);
//ct.show();
}
}
我修改了圖形介面的行事曆程式,可以寫成applet放在網頁上的java apple日曆:
package example;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JButton;
import java.awt.Font;;
/**
* 行事曆程式
*/
public class CalenderCreator extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
//“查看”和“今天”兩個按鈕
private JButton button_left=new JButton("<<");
private JButton button_right=new JButton(">>");
private JLabel YearLabel;
private JLabel MonthLabel;
private JLabel dayLabel;
//擷取今天的日期,年份,月份
private Date now_date=new Date();
private int now_year=now_date.getYear()+1900;
private int now_month=now_date.getMonth();
private int nowDay=now_date.getDate();
//用一組按鈕顯示日期,一共7行7列,第一行為星期的名字
private JLabel[] label_day=new JLabel[42];
private final String[] week={"日","一","二","三","四","五","六"};
private JLabel[] label_week=new JLabel[7];
private String year_int=null; //儲存使用者選擇的年份
private int month_int=0; //儲存使用者選擇的月份
/**
* 建構函式
*/
public CalenderCreator(){
super();
year_int=Integer.toString(now_year);
month_int=now_month;
this.setTitle("日 曆"); //設定標題
this.init();
this.setLocation(500,300);
this.setResizable(false);//設定面板的大小不能變化
pack();
}
/**
*
* 初始化日曆
*/
private void init(){
//月份和年份的標籤
YearLabel=new JLabel(year_int+"年");
MonthLabel=new JLabel((month_int+1) +"月");
dayLabel=new JLabel(nowDay+"號");
Font font=new Font("Dialog",Font.BOLD,14);
YearLabel.setFont(font);
MonthLabel.setFont(font);
dayLabel.setFont(font);
button_left.setFont(font);
button_right.setFont(font);
//放置下拉式清單方塊和控制按鈕的面板
JPanel panel_ym=new JPanel();
panel_ym.add(button_left);
panel_ym.add(YearLabel);
panel_ym.add(MonthLabel);
panel_ym.add(dayLabel);
panel_ym.add(button_right);
//為兩個按鈕添加事件監聽器
button_left.addActionListener(this);
button_right.addActionListener(this);
JPanel panel_day=new JPanel();//放置日期面板
//網格布局管理器,7行7列,網格之間水平和垂直方向間均為5
panel_day.setLayout(new GridLayout(7,7,3,3));
//添加星期的名字,並放到面板裡面
for(int i=0;i<7;i++){
label_week[i]=new JLabel(" ");
label_week[i].setText(week[i]);
label_week[i].setForeground(Color.black);
panel_day.add(label_week[i]);
}
label_week[0].setForeground(Color.red);
label_week[6].setForeground(Color.red);
//添加日期,放到面板裡面
for(int i=0;i<42;i++){
label_day[i]=new JLabel(" ");
panel_day.add(label_day[i]);
}
this.paintDay();//顯示當前年月的日期
JPanel panel_main=new JPanel();//放置以上兩個面板
//邊界布局管理器
panel_main.setLayout(new BorderLayout());
panel_main.add(panel_day,BorderLayout.SOUTH);
panel_main.add(panel_ym,BorderLayout.NORTH);
getContentPane().add(panel_main);
}
/**顯示當前年月的日期*/
private void paintDay(){
//月份和年份的標籤
YearLabel.setText(year_int+"年");
MonthLabel.setText((month_int+1) +"月");
//要求顯示今天的日期
int year_sel=Integer.parseInt(year_int)-1900;//獲得年份置
Date firstDay=new Date(year_sel,month_int,1);//構造該月的第一天
GregorianCalendar cal=new GregorianCalendar();//建立一個Calendar的執行個體
cal.setTime(firstDay);
int days=0;//存放某個月份的天數
int day_week=0;//存放某個月份的第一天是星期幾的數值
//判斷是幾月份,根據它來設定day的值,其中二月份要判斷是否是閏年
if(month_int==0||month_int==2||month_int==4||month_int==6||month_int==7
||month_int==9||month_int==11){
days=31;
}else if(month_int==3||month_int==5||month_int==8||month_int==10){
days=30;
}else{
//二月,如果是閏年,則有29天,否則有28天
if(cal.isLeapYear(year_sel)){
days=29;
}else{
days=28;
}
}
//getDay方法擷取該天是星期幾
day_week= firstDay.getDay();
int count=1;
/**
* 繪製按鈕。在這裡首先要根據選定的月份的第一天是星期幾來確定繪製按鈕的起始位置
* 其中day_week就是我們要繪製的起始位置,對於那些沒有數值可以顯示的按鈕要置空
*/
for(int i=day_week;i<day_week+days;count++,i++){
if(i%7==0||i==6||i==13||i==20||i==27||i==34||i==41){
//如果是邊界上的按鈕,文字用紅色,以來標示周末
if(i==day_week+now_date.getDate()-1){
//將與今天一樣的日期用藍色標示
label_day[i].setForeground(Color.blue);
label_day[i].setText(count+"");
}else{
//其它 邊界上的按鈕中的文字用紅色
label_day[i].setForeground(Color.red);
label_day[i].setText(count+"");
}
}else{
if(i==day_week+now_date.getDate()-1){
//將與今天一樣的日期用藍色標示
label_day[i].setForeground(Color.blue);
label_day[i].setText(count+"");
}else{
//一般位置的按鈕上的文字用黑色標示
label_day[i].setForeground(Color.black);
label_day[i].setText(count+"");
}
}
}
//對於沒有日期數值顯示的按鈕進行置空處理
if(day_week==0){
//如果第一天是周日,則將後米啊的按鈕上的文字都設為空白
for(int i=days;i<42;i++){
label_day[i].setText(" ");
}
}else{
//如果第一天不是周日,則將第一天前面的按鈕置空
for(int i=0;i<day_week;i++){
label_day[i].setText(" ");
}
}
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==button_left){
//如果單擊“查看”按鈕就調用setDay()重新方法繪製按鈕
month_int=month_int-1;
if(month_int<0){
month_int=11;
year_int=Integer.toString(Integer.parseInt(year_int)-1);
}
this.paintDay();
}else if(e.getSource()==button_right){
//如果單擊“今天”按鈕,得到今天的日期
month_int=month_int+1;
if(month_int>11){
month_int=0;
year_int=Integer.toString(Integer.parseInt(year_int)+1);
}
this.paintDay();
}
}
public static void main(String[] args) {
CalenderCreator ct=new CalenderCreator();
ct.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
ct.setVisible(true);
}
}