资源描述
课 程 设 计
一、试验目标
1.加深对课堂讲授内容了解,掌握处理实际应用问题时所应含有查阅资料、技术标准和规范,和软件编程、调试等能力,掌握面向对象编程思想及Java语言程序设计规律和技巧,为深入学习web应用开发及以后从事专业工作打下基础。
2. 使用本学期学习Java SE技术(也能够使用课堂教学中没有学习过Java技术,不过应该以Java SE技术为主)完成多功效日历GUI程序设计,使之含有以下基础功效:十二个月日历用12页显示,每页显示30天日历。日历能够按年或月前后翻动,能够显示目前日期,能够为每页日历选择背景图片。
3.在完成基础功效基础上发挥自己想象力和发明力,使程序凸显出和众不一样特点和功效,形成本小组特征色。
二、试验要求
1.问题描述正确、规范。
2.程序结构合理,调试数据正确、有代表性.。
3.界面布局整齐,人机交互方便。
4.输出结果正确。
5.正确撰写试验汇报。
三、试验内容
编写一个GUI程序实现日历功效。十二个月日历用12页显示,每页显示30天日历。日历能够按年或月前后翻动,能够显示目前日期和目前农历,能够为每页日历选择背景图片。能够实现显示时钟,时钟能进行整点报时。能够实现备忘记事功效,能在天天添加、修改、删除记事等操作。
四、试验步骤
1.在上机试验前,小组组员进行选题讨论,确定小组感爱好而又伸缩性强题目多功效日历。
2.在第一次上机试验时讨论分工,分工明确以后,分头合作进行。
3.各组员完成自己任务后,最终进行统筹合并,和程序最终优化。
4. 依据试验结果,写出合肥工业大学试验汇报。试验汇报应该包含:试验内容,程序步骤图,类结构,程序清单,运行结果,和经过上机取得经验。
5.具体上机试验步骤见任务分工及程序设计进度表。
五、试验结果
经过小组组员共同努力,最终我们小组设计多功效日历程序能够实现试验基础要求——十二个月日历用12页显示,每页显示30天日历。日历能够按年或月前后翻动,能够显示目前日期,能够为每页日历选择背景图片。另外,在完成基础要求基础上,我们增添了显示农历、显示时钟、添加备忘录、修改备忘录等功效。整体程序运行流畅、功效齐全、符合操作习惯。
下面是程序运行效果截图:
日历主界面(能够实现每个月日历,能够按年或按月前后翻动,能够显示目前日期,并能够选择背景图片):
备忘录主界面(实现备忘录添加,及目前日历显示):
备忘录主界面(实现备忘录显示,及对目前备忘录修改删除等):
时钟主界面(显示目前时间,实现报整点报时功效):
六、试验总结
两周课程设计结束了,在这其中历尽酸甜苦辣咸多种滋味,不过收获颇丰。从学习C语言、数据库等等计算机编程类课程开始,自己一直有种感觉,那就是太理论化了、缺乏实践。而这次Java程序设计能够说和以往大不相同,先是在课堂上老师讲述了相关基础理论、基础语法知识,以后再加上这两周课程设计,能够说是真正能够体会到程序编程乐趣,也第一次发觉自己原来对程序设计是如此感爱好。尤其是因为课程时间较紧,课上时间老师只是简单给我们讲述了一下Java Swing基础知识,并没有去深入,而在此次课程设计中大量用到监听事件相关知识需要自己去查标准文档,去网上找相关系料,这无疑对自己是一个挑战。不过两周下来,我做到了,我独立完成了对备忘录程序编写,累积下来这部分共包含到包含Action Listener,Mouse Listener,Menu Listener,Document Listener等多种各类监听18个监听,分为6个类,累计完成程序千余行。而给我印象最深刻便监听了,能够说是整个备忘录大部分代码全部是和监听相关,这也是让我我学会了对程序监听利用,当然只是学会远远谈不上精通。
我编写类有Test、MainWin、MyMenuListener1、PoliceListen、PoliceListen2、MyWindowListener。其中Test类关键是用来定义备忘录主窗口多种组件和在相关组件上添加监听以实现备忘录添加、修改、删除等功效。MainWin类关键是用来创建Test对象,用以显示窗口。MyMenuListener1关键是给今日待办菜单定义菜单监听,从而使其选中后能显示今日待办备忘记事,而当未被选中时相关文字、按钮又全部会隐藏掉。PoliceListen关键是用来定义日历日期按钮事件监听,用以监听当点击相关日期时会弹出对应日期备忘记事窗口来。PoliceListen2关键是定义备忘录窗口中添加按钮时间监听,使其被点击后能够显示添加备忘记事功效相关功效按钮和相关文本区。MyWindowListener关键是定义备忘录窗口窗口监听,和PoliceListen共同使用来对窗口激活状态进行监听,以确保窗口能够根据预定计划弹出和关闭。
在试验过程中碰到了大大小小多种困难,经过自己查资料、问询老师、同学讨论基础处理了这些困难。下面我就说一说在这次课程设计中碰到问题有哪些,和自己处理措施和从中得出经验心得。首先在对备忘录窗口布局问题上,一开始采取流式布局,按钮少时候效果还算说得过去,不过当按钮一多整个布局就不那么好控制了了。为了实现预期效果,最终采取了null布局,在该种布局下,需要为每个组件指定坐标,不然组件将不会显示。首先我想法是,依据窗口高度和宽度来对按钮进行布局,我相信这种方法肯定是正规程序设计中在布局是采取方法,不过摆在眼前问题是时间比较紧,没有大量时间来进行这种比较正确地布局。所以,最终是经过不停地尝试来给组件给予坐标值,最终效果是肉眼感觉起来是不错,假如时间充足当然能够做更正确一点。
第二个问题也是一个比较简单问题,因为刚开始不熟悉监听,所以碰到了弹出一个窗口后,再点击这个按钮原来根据效果不应该在弹出窗口,不过依旧能弹出。为了处理这个问题,自己想了一个措施那就是标识,当有窗口弹出时,将标识值变成1,而当标识值为1时候,点击此按钮将不会触发监听事件,只有当标识值为0时候该监听事件才能起到作用,然后当此窗口状态为关闭时,又会将该标识值变成0,这么效果关键是经过PoliceListen和MyWindowListen两个类来完成,其中PoliceListen是鼠标监听,而MyWindowListen则是窗口监听。这是这一个监听最终在自己努力下成功了,才使自己对监听事件产生了浓厚爱好,以至于以后加了那么多监听即使困难很多也没有退缩。自己也从中体会到平时程序之所以能够对应操作原理,那就是对命令、对动作进行监听。而且,有时候看起来很简单功效实现起来也不是很轻易,就像本例中所说那样。
在完成了第一个监听以后,又在Test里面加入了N多个监听,这些监听大部分是ActionListener监听,也即最常有一类监听。为了避免类过多,我大多采取了匿名类方法内嵌于Test类中。这些监听设计中,大部分没有碰到问题,有少数是因为自己逻辑次序不对而没有达成预期效果,最终全部能调整过来。碰到问题是读取选中日期,和在那三个下拉框中怎么依据年份和月份来添加后面日期(如此叙述可能不太明了,老师能够对照程序截图中备忘录主窗口中那个日期下拉框来看),其实最终处理了就会发觉,其实这些也并不难,在日期处理上只要监听年份和月份。年份判定该年是否为闰年,月份判定是那个月,最终能够确定该月应该添加多少item到下拉框中。而读取选中日期则是将日历主窗口文本框中年份、下拉框中月份和点击按钮上数字读取出来将她们分别设置成下拉框中默认年月日则可。另外为了使得后面备忘记事文件名称长度一致,在进行加入时候会先比对一下该数字是否为两位数,假如不是两位数则将前面加0后再导入。
下一个问题则是在监听文本框问题上,因为书本上对DocumentListener也是简单介绍了下,为了实现预想效果,即在文本框有文字时候下面确实定键可用,没有文字时候下面确实定键不可用而只有取消键可用,经过查阅标准文档和问询老师,最终搞清楚了每个抽象方法含义,顺利实现了该功效。
最终,在怎样保留每日志事问题上,处理这一问题能够有两种思绪,一个是搭建一个数据库,两一个是经过保留文件形式。毫无疑问,经过写入数据库方法更有难度、更有挑战性,不过考虑到在备忘录方面一直全部是我一个人在做,精力方面可能不够,最终我采取了写文件形式来保留,每日志事。以后发觉有组使用数据库实现,最终她们组得分B+,我们得分B,其实有时候输在了不敢尝试上、或说分工更明确一点愈加好(毕竟有些东西一个人做了,她人或许有帮忙心也差不上手了)。当然即使写文件形式比较简单一点,这中间也要做好相关逻辑设计。在写文件时候采取选中日期为文件名方法进行保留,在读文件时候则读取以选中日期文件命名文件,将其显示在文本区中。另外在修改了当日志事后,炫耀对文件以一样方法进行保留。
最终该程序还有不足,比如说未能实现相关时间提醒功效、有些细节处理不够使得部分地方缺乏人性化。对于代码这部分,自己第一次编写者这些代码有些地方还需要锻炼,比如说对类划分、对相关语句进行打包成一个函数来反复调用提升代码重用性等等,因为有些语句(像设置组件可见不可见语句)在大量地方全部用到了,不过我写时候只是把她们复制下来,这部分代码应该做成一个函数,或抽象成类效果能愈加好点。验收结束那一刻全部压力、全部因碰到而尝到苦涩最终全部化成满满喜悦,或在某种程度上更是一个成就感。
七、附件
1.程序步骤图、类结构图
(1)程序步骤图
该程序能够分为三个部分,即日历主程序和时钟、备忘录两个程序。其中时钟程序是经过日历主界面上按钮触发事件来开启并创建对应窗口,备忘录程序是经过日历上按钮事件触发。日历主窗口能够实现分页显示、上下翻动、为每个月选定背景等功效,时钟窗口能够实现指针和数字时钟显示、整点报时功效,备忘录程序能够经过创建、修改、删除已选定日期为文件名文件来实现添加、修改、删除多条记事功效。整个程序步骤以下图(因为整个步骤图较大,为了使其在听一个版面中显现出来,所以有些字体可能偏小,老师如若看不清,能够用Visio打开放大查看)所表示:
(2)类图
日历程序类图:
时钟主程序关键包含四个类,其中OurCalender、MainWin、ACalender三个类是全部是JFrame子类。OurCalender里包含程序入口,Mainwin关键用来创建窗口对象,ACalender关键用来创建日历对象,NongLi关键用来进行农历显示。日历程序类图以下所表示:
。
时钟类图:
时钟类关键包含DrawClock和Clock类,其中DrawClock类关键是用来创建时钟对象,而Clock类关键是用来创建窗口对象和时钟监听来进行整点报时。时钟程序类图以下所表示:
备忘录类图:
备忘录部分关键包含Test、PoliceListen、PoliceListen2、MyMenuListener1、Mainwin等类。其中MainWin类关键是用来创建备忘录窗口对象,Test关键定义备忘录相关组件和添加对应监听事件以实现备忘记事添加、修改、删除等功效。PoliceListen类关键用来定义日历按钮监听。PoliceListen2关键是用来定义备忘录中添加按钮监听。MyMenuListener1关键是用来定义今日待办事件监听。
2.程序清单
(要说明程序功效和程序之间关系,如程序很多,能够只附关键程序代码)
OurCalendar.Java
public class OurCalendar{
public static void main(String[] args){
try{
MainWin frame = new MainWin();
}
catch (Exception e){
System.out.print("run error!");
}
}
}
这里关键用来创建日历窗口对象,显示日历主窗口
MainWin.java
public class MainWin extends JFrame implements ActionListener{
//JPanel jP;
public MainWin(){
ACalendar cal = new ACalendar();
Icon img=new ImageIcon("clock.jpg");
JButton time=new JButton(img)
setLocationRelativeTo(null);
setLocation(100,81);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(560,560);
setVisible(true);
setResizable(false);
this.setLayout(null);
this.setTitle("我们日历");
this.add(cal);
cal.setBounds(0,30,560,500);
this.add(time);
time.setBounds(250,0,25,25);
time.setBorderPainted(false);
time.setContentAreaFilled(false);
time.addActionListener(this);
time.setContentAreaFilled(false);
}
public void actionPerformed(ActionEvent e){
Clock ck=new Clock();
}
}
这里关键用来定义日历主窗口类组件。
ACalender.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import static javax.swing.JFrame.*;
import java.util.*;
import javax.swing.JFrame.*;
import static java.util.Calendar.*;
public class ACalendar extends JPanel implements ActionListener {
public static final String HOUR_OF_DAY = null;
//定义
PoliceListen police=new PoliceListen();
static String strbuttonyear,strbuttonmonth,strbuttonday;
JTextField Year=new JTextField();
JComboBox Month = new JComboBox();
JLabel TheYear = new JLabel("年");
JLabel TheMonth = new JLabel("月");
Date this_date = new Date();
JLabel[] Label_title = new JLabel[7];
JButton[] Button_day=new JButton[42];
JButton Up1=new JButton(">");
JButton Down2=new JButton("<");
JButton Up2=new JButton(">");
JButton Down1=new JButton("<");
JButton Today=new JButton("TADAY");
String background;
JPanel jP;
ImageIcon img=new ImageIcon();
JLabel imgLabel;
JPanel pane_ym = new JPanel();
JPanel pane_day = new JPanel();
int this_year = this_date.getYear() + 1900;
int this_month = this_date.getMonth();
boolean bool = false;
String year_num = null;
int month_num;
int week,day;
public String getBG(){
return background;
}
public void setBG(String background){
this.background=background;
}
public ACalendar() {
super();
jP=new JPanel();
this.setOpaque(false);
//this.setOpaque(false);
//设定年月
TheYear.setFont(new Font("华文隶书",Font.TRUETYPE_FONT,27));
TheMonth.setFont(new Font("华文隶书",Font.TRUETYPE_FONT,27));
Year.setFont(new Font("华文隶书",Font.TRUETYPE_FONT,27));
Month.setFont(new Font("华文隶书",Font.TRUETYPE_FONT,27));
pane_ym.setOpaque(false);
pane_day.setOpaque(false);
Year.setText(Integer.toString(this_year));
for (int i = 1; i < 13; i++) {
Month.addItem(i + "");
}
pane_ym.add(new JLabel(" "));
pane_ym.add(Down2);
pane_ym.add(Year);
pane_ym.add(Up2);
pane_ym.add(TheYear);
pane_ym.add(Today);
Month.setSelectedIndex(this_month);
pane_ym.add(Down1);
pane_ym.add(Month);
pane_ym.add(Up1);
pane_ym.add(TheMonth);
pane_ym.add(new JLabel(" "));
Month.addActionListener(this);
Year.addActionListener(this);
Up1.addActionListener(this);
Up2.addActionListener(this);
Down1.addActionListener(this);
Down2.addActionListener(this);
Today.addActionListener(this);
img= new ImageIcon("E:\\c.jpg");
imgLabel = new JLabel(img);
//初始化日期并绘制
pane_day.setLayout(new GridLayout(7, 7, 10, 10));
for (int i = 0; i < 7; i++) {
Label_title[i] = new JLabel(" ");
Label_title[i].setOpaque(false);
Label_title[i].setFont(new Font("华文行楷",Font.TRUETYPE_FONT,56));
pane_day.add(Label_title[i]);
}
for (int i = 0; i < 42; i++) {
Button_day[i] = new JButton(" ");
Button_day[i].setFont(new Font("华文行楷",Font.TRUETYPE_FONT,30));
Button_day[i].setBorderPainted(false);
Button_day[i].setContentAreaFilled(false);
pane_day.add(Button_day[i]);
Button_day[i].addMouseListener(police);
Button_day[i].addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Button_dayyearboxActionPerformed(e);
}
});
}
this.setYM();
this.setImg(month_num);
this.setDay();
this.add(jP);
jP.setOpaque(false);
//jp.setSize(1150,750);
//jp.setContentAreaFilled(false);
this.setLayout(new BorderLayout());
this.add(pane_day, BorderLayout.CENTER);
this.add(pane_ym, BorderLayout.NORTH);
//this.setSize(100,250);
this.setSize(1150,750);
setSize(1150,750);
//setSize(300,300);
}
void setYM() {
if (bool) {
year_num = this_year + "";
month_num = this_month;
}
else {
year_num = Year.getText();
month_num = Month.getSelectedIndex();
}
}
void setDay() {
int year_set = Integer.parseInt(year_num) - 1900; //取得年份值
Date dt = new Date(year_set, month_num, 1); //结构一个日期
GregorianCalendar cal = new GregorianCalendar(); //创建一个Calendar实例
cal.setTime(dt);
String week[] = { "日", "一","二", "三", "四", "五", "六" };
int day = 0;
int day_week = 0;
for (int i = 0; i < 7; i++) {
Label_title[i].setText(week[i]);
}
//月份
if (month_num == 0||month_num == 2 ||month_num == 4 ||month_num == 6 ||
month_num == 7|| month_num == 9 ||month_num == 11) {
day = 31;
}
else if (month_num == 3 ||month_num == 5 ||
month_num == 8 ||month_num == 10) {
day = 30;
}
else{
if (cal.isLeapYear(year_set)) {
day = 29;
}
else {
day = 28;
}
}
day_week = dt.getDay();
int count = 1;
for (int i = day_week; i < day_week + day; count++, i++) {
if (i % 7 == 0 ||i == 13||i == 20||i == 27||
i == 6 ||i == 34 ||i == 41) {
if (i == day_week + this_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 + this_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 < 42; i++) {
Button_day[i].setText(" ");
Button_day[i].setContentAreaFilled(false);
Button_day[i].addActionListener(this);
}
} else {
for (int i = 0; i < day_week; i++) {
Button_day[i].setText(" ");
}
for (int i = day_week + day; i < 42; i++) {
Button_day[i].setText(" ");
}
}
}
Calendar calendar= Calendar.getInstance();
public int getYear(){return Integer.parseInt(year_num);}
public int getMonth(){return month_num;}
public int getWeek(){
week=calendar.get(DAY_OF_WEEK);
return week;}
void setImg(int month_num){
//System.out.println(month_num);
//month_num = Month.getSelectedIndex();
/*if(mon_num==0){
img[0] = new ImageIcon("E:\\tupian\\1.jpg");//这是背景图片
imgLabel = new JLabel(img[0]);//将背景图放在标签里
}*/
switch(month_num){
case 0:setBG("./Images/1.jpg");break;
case 1:setBG("./Images/2.jpg");break;
case 2:setBG("./Images/3.jpg");break;
case 3:setBG("./Images/4.jpg");break;
case 4:setBG("./Images/5.jpg");break;
case 5:setBG("./Images/6.jpg");break;
case 6:setBG("./Images/7.jpg");break;
case 7:setBG("./Images/8.jpg");break;
case 8:setBG("./Images/9.jpg");break;
case 9:setBG("./Images/10.jpg");break;
case 10:setBG("./Images/11.jpg");break;
case 11:setBG("./Images/12.jpg");break;
} updateUI();
}
public void actionPerformed(ActionEvent e) {
if (e.getSource() == Year || e.getSource() == Month) {
this.setYM();
this.setImg(month_num);
this.setDay();
}
else if(e.getSource()==Up1){
this.setYM();
if(month_num==11){
int y=Integer.parseInt(year_num);
y++;
this.setYM();
month_num=0;
Month.setSelectedIndex(month_num);
year_num=Integer.toString(y);
Year.setText(year_num);
this.setImg(month_num);
this.setDay();
}
else{
Month.setSelectedIndex(++month_num);
this.setDay();
this.setImg(month_num);
}
}
else if(e.getSource()==Down1){
this.setYM();
if(month_num==0){
int y=Integer.parseInt(year_num);
y--;
this.setYM();
month_num=11;
Month.setSelectedIndex(month_num);
year_num=Integer.toString(y);
Year.setText(year_num);
this.setDay();
}
else{
Month.setSelectedIndex(--month_num);
this.setDay();
this.setImg(month_num);
}
}
else if(e.getSource()==Down2){
this.setYM();
int y=Integer.parseInt(year_num);
y--;
this.setYM();
year_num=Integer.toString(y);
Year.setText(year_num);
this.setDay();
this.setImg(month_num);
}
else if(e.getSource()==Up2){
this.setYM();
int y=Integer.parseInt(year_num);
y++;
this.setYM();
year_num=Integer.toString(y);
Year.setText(year_num);
this.setDay();
this.setImg(month_num);
}
else if(e.getSource()==Today){
bool=true;
this.setYM();
this.setDay();
this.setImg(month_num);
Year.setText(year_num);
Month.setSelectedIndex(month_num);
}
}
public void Button_dayyearboxActionPerformed(ActionEvent e){
strbuttonday=e.getActionCommand();
strbuttonyear=Year.getText();
day=Integer.parseInt(strbuttonday);
strbuttonmonth=Month.getSelectedIndex()+1+"";
if(strbuttonday.length()<2){strbuttonday="0"+strbuttonday;}
if(strbuttonmonth.length()<2){strbuttonmonth="0"+strbuttonmonth;}
};
public int getDay(){
//day=calendar.get(DAY_OF_MONTH);
return day;}
public v
展开阅读全文