1. 程式人生 > >萬年曆-Java課程設計題(eclipse編輯器)

萬年曆-Java課程設計題(eclipse編輯器)


專案目錄結構:


`CalendarMainClass.java`

package Calendar;

/**
 * CalendarMainClass主類
 * @author Administrator
 * @version 版本1.0
 */
public class CalendarMainClass {								

	/**
	 * 主函式
	 * @param args 傳入的引數 args
	 */
	public static void main(String[] args) {
		/**
		 * 建立一個基於CalendarFrame的主容器fram
		 */
		CalendarFrame frame=new CalendarFrame();		
		/**
		 * 設定主容器的顯示位置,以及介面的高和寬資料
		 */
		frame.setBounds(200,150,670,490);	
		/**
		 * 設定主容器為可見
		 */
		frame.setVisible(true);		
		/**
		 * 主容器初始化年月資訊
		 */
		frame.setYearAndMonth(2016,1);							
		/**
		 * 設定主容器的標題
		 */
		frame.setTitle("萬年曆");		
		
	
	}

}
`CalendarFrame.java`
package Calendar;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.text.SimpleDateFormat;

import javax.swing.*;
import javax.swing.border.*;
/**
 * 
 * 窗體的具體構造及執行程式碼 
 * @author Administrator
 * @version 版本1.0
 */
public class CalendarFrame extends JFrame implements ActionListener,ItemListener{
	private static final long serialVersionUID = 1L;
	/**
	 * labelDay[] 存放每一天的標籤陣列|
	 * titleName 顯示標題欄名稱的按鈕|
	 * text 輸入年份的文字框|
	 * button,button1 按鈕元件|
	 * label 標籤|
	 * comBox 下拉列表元件|
	 * showMessage 顯示日曆的標籤項
	 * 
	 */
	JLabel labelDay[]=new JLabel[42];										
	JButton titleName[]=new JButton[7];										
	JTextField text;														
	JButton button,button1;													
	JLabel label1,label2;																		
	JComboBox<String> comBox;														
	String name[]={"日","一","二","三","四","五","六"};							
	CalendarBean calendar;													
	JLabel showMessage=new JLabel("",JLabel.CENTER);						

	int year=2011,month=2;
	/**
	 * JFrame都是Windows類的子類,因此主視窗為Windows型容器,其預設佈局為BorderLayout佈局
	 */
	public CalendarFrame(){	
		/**
		 * 為窗體修改自定義圖示
		 */
		Image icon=Toolkit.getDefaultToolkit().getImage("F:\\eclipse\\程式碼區\\Calendar\\src\\Calendar\\calendar1.png");
		setIconImage(icon);
		/**
		 * 建立面板(可向面板中新增元件,再將面板新增到其他容器中)
		 */
		JPanel pCenter=new JPanel();		
		/**
		 * 將pCenter的佈局設定為7行7列的GridLayout佈局
		 */
		pCenter.setLayout(new GridLayout(7,7));	
		pCenter.setBackground(Color.WHITE);
		/**
		 * 向主容器中新增星期欄
		 */
		for(int i=0;i<7;i++){												
			titleName[i]=new JButton(name[i]);								
			titleName[i].setBorder(new SoftBevelBorder(BevelBorder.RAISED));	
			//titleName[i].setBackground(Color.green);
			pCenter.add(titleName[i]);										
		}																	
		/**
		 * 向主容器新增每個小日期標籤
		 */
		for(int i=0;i<42;i++){												
			labelDay[i]=new JLabel("",JLabel.CENTER);
			labelDay[i].setBorder(new SoftBevelBorder(BevelBorder.LOWERED));	
			pCenter.add(labelDay[i]);										
		}				  
		/**
		 * 宣告calendar為calendarBean類的子類
		 */																	
		calendar=new CalendarBean();	
		/**
		 * 設定個元件的具體內容
		 * 
		 */																	
		text=new JTextField(3);	
		text.setText("2016");
		button=new JButton("轉到");									
		button1=new JButton("當前日期");										
		label1=new JLabel("                          萬年曆           ");
		/**
		 * 設定label標籤的字型大小為30px
		 */																	
		label1.setFont(new Font("",1,30));	
		/**
		 * 建立下拉列表,並新增下拉列表選項
		 */			
		label2=new JLabel("今日:");
		comBox=new JComboBox<String>();																							
		String []a={"1","2","3","4","5","6","7","8","9","10","11","12"};
		for(int i=0;i<a.length;i++)											
		comBox.addItem(a[i]);		
		/**
		 * 向元件新增響應事件
		 */																	
		button.addActionListener(this);									
		button1.addActionListener(this);									
		comBox.addItemListener(null);	
		/**
		 * 建立pNorth,pSouth面板
		 */																	
		JPanel pNorth=new JPanel();	
		pNorth.setBackground(Color.cyan);
		JPanel pSouth=new JPanel();		
		/**
		 * 向面板中新增各個元件
		 */																	
		pNorth.add(label1);		
		pNorth.add(label2);
		pSouth.add(button1);																																	
		pSouth.add(text);
		pSouth.add(new JLabel("年"));					
		pSouth.add(comBox);	
		pSouth.add(new JLabel("月"));																						
		pSouth.add(button);													
		pSouth.add(showMessage);		
		/**
		 * 將三個面板新增到以BorderLayout為佈局的主Windows型容器中
		 */																	
		add(pCenter,BorderLayout.CENTER);									
		add(pNorth,BorderLayout.NORTH);										
		add(pSouth,BorderLayout.SOUTH);		
		/**
		 * 向setYearAndMonth方法傳入year,month的值
		 */																	
		setYearAndMonth(year,month);
		/**
		 * 設定,當點選窗體右上角的關閉圖示時,程式會做出直接結束程式的處理
		 */																	
		setDefaultCloseOperation(DISPOSE_ON_CLOSE);							
	}
	/**
	 * ------編寫傳入年月的方法setYearAndMonth------
	 * @param y 年份
	 * @param m 月份
	 */
	public void setYearAndMonth(int y,int m){								
		calendar.setYear(y);
		/**
		 * 將setYearAndMonth方法得到的year,month的值傳給calendar類
		 */																	
		calendar.setMonth(m);		
		/**
		 * 獲取calendar類中getCalendar方法中的日期字串陣列,將獲取的字串陣列的值傳給每個labelDay小日期標籤
		 */	
		String day[]=calendar.getCalendar();
		for(int i=0;i<42;i++)												
			labelDay[i].setText(day[i]);	
		/**
		 * 在showMessage標籤中顯示輸出日期
		 */	
		showMessage.setText("日曆:"+calendar.getYear()+"年"+calendar.getMonth()+"月");
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm");
		label2.setText("今日:"+df.format(new Date()));
		/**
		 * 設定標籤輸出的字型顏色為藍色
		 */	
		showMessage.setForeground(Color.BLUE);								
	}																		
	/**
	 * ---------重寫actionPerformed方法---------
	 */	
	public void actionPerformed(ActionEvent e){								
		/**
		 * reg為正則表示式,表示純數字的字串(不含其他任何與數字無關的字元)
		 */
		String reg="^[\\d]*$";
		/**
		 * 判斷響應事件觸發的是button元件
		 */
		if(e.getSource()==button){											
			/**
			 * 這個地方如何讓程式識別並彈出對話方塊,而不是在未輸入時直接判別程式出錯
			 */	
			if(text.getText().isEmpty()){				
				
				JOptionPane.showMessageDialog(this, "您未輸入年份", "訊息對話方塊", JOptionPane.WARNING_MESSAGE);
				/**
				 * 將螢幕焦點聚在text元件上
				 */
				text.requestFocus(true);
			}
			/**
			 * 判斷text文字框中是否為純數字,若不是則彈出對話方塊 "您輸入了非法字元"
			 */
			else if(!(text.getText()).matches(reg)){
			JOptionPane.showMessageDialog(this, "您輸入了非法字元", "訊息對話方塊", JOptionPane.WARNING_MESSAGE);
			}
			/**
			 * 判斷text文字框中是否為純數字,若是,則輸出相應年份
			 */
			else {
			
				/**
				 * 將文字框中得到的字串強制轉為整型值,並賦值給整型變數i
				 */	
			Integer i=Integer.parseInt(text.getText());	
			/**
			 * 將整型i變數中的值傳遞給calendar類中,並設定為year值
			 */
			calendar.setYear(i);
			}
			
		
			/**
			 * 判斷使用者是否使用了下拉列表框,若未使用,則彈出訊息對話方塊 "您未選擇月份"
			 */
			if(((String)comBox.getSelectedItem()).equals("選擇月份"))	{			
				JOptionPane.showMessageDialog(this, "您未選擇月份", "訊息對話方塊", JOptionPane.WARNING_MESSAGE);
				/**
				 * 將螢幕焦點聚在comBox元件上
				 */
				comBox.requestFocus(true);
			}
			else{
			/**
			 * 將下拉列表框中選中的字串值強制轉換為整型,並賦值給整型變數j
			 */	
			Integer j=Integer.parseInt(comBox.getSelectedItem().toString());
			/**
			 * 將整型i變數中的值傳遞給calendar類中,並設定為month值
			 */	
			calendar.setMonth(j);											
			/**
			 * 獲取calendar類中getCalendar方法中的日期字串陣列
			 */	
			String day[]=calendar.getCalendar();							
			/**
			 * 將獲取的字串陣列的值傳給每個labelDay小日期標籤
			 */	
			for(int n=0;n<42;n++){
				labelDay[n].setText(day[n]);									
			}
			}
			/**
			 * 在showMessage標籤中顯示輸出日期
			 */	
			showMessage.setText("日曆:"+calendar.getYear()+"年"+calendar.getMonth()+"月");
		}
		/**
		 * 判斷響應時間觸發的是button1元件
		 */	
		else if(e.getSource()==button1){		
			/**
			 * --------------獲取系統當前日期--------------
			 */	
			Calendar c=Calendar.getInstance();								
			int y=c.get(Calendar.YEAR);										
			int m=c.get(Calendar.MONTH)+1;
			calendar.setMonth(m);
			String day[]=calendar.getCalendar();							
			for(int n=0;n<42;n++){
				labelDay[n].setText(day[n]);									
			}
			showMessage.setText("日曆:"+y+"年"+m+"月");	
			text.setText("");
		}																	
		/**
		 * 設定showMessage標籤的字型顏色為藍色
		 */	
		showMessage.setForeground(Color.BLUE);								
	}
	/**
	 * ---------重寫itemStateChanged方法--------
	 * 下拉列表的響應事件具體已經在actionPerformed方法內實現
	 */	
	public void itemStateChanged(ItemEvent arg0) {							
		// TODO Auto-generated method stub									
	}																		
}

`CalendarBean.java`

package Calendar;
import java.util.Calendar;
/**
 * 生成日曆字串陣列
 * @author Administrator
 * @version 版本1.0
 */
public class CalendarBean {
	String day[];
	int year=2005,month=0;
	/**
	 * 設定year的set和get方法
	 * @param year 年份
	 * 
	 */
	public void setYear(int year){									
		this.year=year;												
	}																
	public int getYear(){											
		return year;												
	}					
	/**
	 * 設定month的set和get方法
	 * @param month 月份
	 */
	public void setMonth(int month){								
		this.month=month;											
	}																
	public int getMonth(){											
		return month;
	}																
	
	/**
	 * 建立可以得到具體日期的字串陣列
	 * @return 返回具體日期的字串陣列
	 */
	public String[] getCalendar(){									
		String a[]=new String[42];
		Calendar 日曆=Calendar.getInstance();
		日曆.set(year, month-1, 1);
		int 星期幾=日曆.get(Calendar.DAY_OF_WEEK)-1;
		int day=0;
		if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
			day=31;
		if(month==4||month==6||month==9||month==11)
			day=30;
		if(month==2){
			if(((year%4==0)&&(year%100!=0))||(year%400==0))
				day=29;
			else
				day=28;
		}
		for(int i=星期幾,n=1;i<星期幾+day;i++){
			a[i]=String.valueOf(n);
			n++;
		}
		return a;
	}
}