學號: 201303014008 姓名:張燕 班級:計科(高職)13-1
一、題目簡介
利用Java GUI的元件類、容器類和輔助類設計所選專案的使用者介面,並在深入理解並掌握事件驅動程式設計原理的基礎上,實現事件驅動的程式設計。
1.實現圖形介面。
2.能以月曆形式顯示日期與星期。工作日、雙休日、當天分別以黑色、紅色和藍色顯示。
3.支援使用者通過下拉形式選單來選擇月份。
4.通過點選“現在日期”來重新整理日曆。
二.結對分工
結對者: 張燕 黃彥瀟
張燕:程式碼編寫以及程式測試
黃彥瀟:程式分析及程式碼規範
三.程式碼地址:
https://github.com/yranqiu/test/blob/master/shiyan3
四.測試程式碼:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
public class CalenderTrain extends JFrame implements ActionListener {
JComboBox Month = new JComboBox(); //月份下拉選單框
JComboBox Year = new JComboBox(); //年份下拉選單框
JLabel Year_l = new JLabel("年份:"); //定義標籤
JLabel Month_l = new JLabel("月份:"); //定義標籤
Date now_date = new Date(); //獲取今天的日期
JButton[] button_day = new JButton[49]; //定義一個陣列用來存放日期
JButton button_jump = new JButton("日期跳轉"); //現實選擇日期
JButton button_today = new JButton("現在日期"); //顯示今天日期按鈕
int now_year = now_date.getYear() + 1900; //獲取年份值
int now_month = now_date.getMonth(); //獲取月份值(當前月份-1)
boolean bool = false;
String year_int = null; //存放年份
int month_int; //存放月份
JPanel pane_ym = new JPanel(); //放置下拉選單框和控制按鈕皮膚
JPanel pane_day = new JPanel(); //放置日期皮膚
JPanel pane_parent = new JPanel(); //放置以上兩個皮膚
//定義方法繪製皮膚
public CalenderTrain() {
super("JAVA日曆程式"); //設定皮膚標題
//---以下幾行使得關閉皮膚時退出程式
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClose(WindowEvent e) {
//System.out.print("CLOSING THE WIN");
System.exit(0);
}
});
setResizable(false); //皮膚的大小不能變化
//設定年月
/*年份的區間是當前年份的過去10年到當前年份的未來20年
* 月份正常1-12月
*/
for (int i = now_year - 10; i <= now_year + 20; i++) {
Year.addItem(i + "");
}
for (int i = 1; i < 13; i++) {
Month.addItem(i + "");
}
Year.setSelectedIndex(10); //設定年份下拉選單為當前年份
//Year.setText()
pane_ym.add(Year_l); //新增年份標籤
pane_ym.add(Year); //新增年份下拉選單框
Month.setSelectedIndex(now_month); //設定月份下拉選單為當前月份
pane_ym.add(Month_l); //新增月份標籤
pane_ym.add(Month); //新增月份下拉選單框
pane_ym.add(button_jump); //新增跳轉按鈕
pane_ym.add(button_today); //新增“現在日期”按鈕
button_jump.addActionListener(this); //跳轉按鈕新增 監聽事件
button_today.addActionListener(this); //“現在日期”按鈕新增 監聽事件
//年月設定結束
//初始化日期按鈕並繪製
pane_day.setLayout(new GridLayout(7, 7));
for (int i = 0; i < 49; i++) {
button_day[i] = new JButton(" ");
pane_day.add(button_day[i]);
}
this.setDay(); //呼叫setDay()方法
pane_parent.setLayout(new BorderLayout()); //設定佈局管理器
setContentPane(pane_day);
setContentPane(pane_ym);
pane_parent.add(pane_day, BorderLayout.SOUTH);
pane_parent.add(pane_ym, BorderLayout.NORTH);
setContentPane(pane_parent);
pack();
show();
}
//SET DAY 方法,顯示日期
void setDay() {
if (bool) {
year_int = now_year + "";
month_int = now_month;
} else {
year_int = Year.getSelectedItem().toString();
month_int = Month.getSelectedIndex();
//year_int=Year.getText();
//month_int=Integer.parseInt(Month.getText());
}
int year_sel = Integer.parseInt(year_int) - 1900; //獲得年份值
Date dt = new Date(year_sel, month_int, 1); //構造一個日期
GregorianCalendar cal = new GregorianCalendar(); //建立一個Calendar例項
cal.setTime(dt);
String week[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };
int day = 0; //day中存放某個月份的天數
int day_week = 0; //用來存放某個月的第一天是星期幾的數值
//--將星期新增到前7個按鈕中
for (int i = 0; i < 7; i++) {
button_day[i].setText(week[i]);
}
//--
/*判斷是幾月份,根據它來設定day的值
* 其中二月份要判斷是否是閏年
*/
if (month_int == 0
|| month_int == 2
|| month_int == 4
|| month_int == 6
|| month_int == 7
|| month_int == 9
|| month_int == 11) {
day = 31;
} else if (
month_int == 3
|| month_int == 5
|| month_int == 8
|| month_int == 10) {
day = 30;
} else {
if (cal.isLeapYear(year_sel)) {
day = 29;
} else {
day = 28;
}
}
day_week = 7 + dt.getDay();
int count = 1;
/*繪製按鈕
*首先要根據選定的月份的第一天是星期幾來確定我們繪製按鈕的起始位置
* 其中day_week就是我們要繪製的起始位置
* 對於那些沒有數值可以顯示的按鈕要置空
*/
for (int i = day_week; i < day_week + day; count++, i++) {
if (i % 7 == 0
|| i == 13
|| i == 20
|| i == 27
|| i == 48
|| 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 = day; i < 49; i++) {
button_day[i].setText(" ");
}
} else {
//第一天前面的按鈕置空
for (int i = 7; i < day_week; i++) {
button_day[i].setText(" ");
} //最後一天後面的按鈕置空
for (int i = day_week + day; i < 49; i++) {
button_day[i].setText(" ");
}
}
}
//點選按鈕產生的效果
public void actionPerformed(ActionEvent e) {
if (e.getSource() == button_jump) {
bool = false;
this.setDay(); //如果點選跳轉按鈕就呼叫setDay()方法重新繪製按鈕
} else if (e.getSource() == button_today) {
bool = true;
this.setDay(); //如果點選現在日期按鈕,得到今天的日期
Month.setSelectedIndex(now_month);//將月份置為當前月份
Year.setSelectedIndex(10); //將年份置為當前年份
}
}
public static void main(String[] args) {
CalenderTrain ct = new CalenderTrain();
}
}
}
五、測試結果
六.問題及心得:
在本次實踐中,程式碼編寫經常出現錯誤,執行了好幾次才成功,通過結對,我學會了和隊員進行合作,容易提高效率和找到自己的錯誤並改正。