Java课程设计实验分析报告及全部源码流程图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java课程设计实验报告及全部源码流程图
————————————————————————————————作者:————————————————————————————————日期:
2
课程设计
一、实验目的
1.加深对课堂讲授内容的理解,掌握解决实际应用问题时所应具有的查阅资料、技术标准和规范,以及软件编程、调试等能力,掌握面向对象的编程思想及Java语言程序设计的规律与技巧,为进一步学习web应用开发及今后从事专业工作打下基础。
2. 使用本学期学习的Java SE技术(也可以使用课堂教学中没有学习过的Java技术,但是应当以Java SE技术为主)完成多功能日历GUI程序的设计,使之具有如下基本功能:一年日历用12页显示,每页显示一个月的日历。
日历可以按年或月前后翻动,能够显示当前的日期,可以为每页日历选择背景图片。
3.在完成基本功能的基础上发挥自己的想象力与创造力,使程序凸显出与众不同的特点与功能,形成本小组的特性色。
二、实验要求
1.问题描述准确、规范。
2.程序结构合理,调试数据准确、有代表性.。
3.界面布局整齐,人机交互方便。
4.输出结果正确。
5.正确撰写实验报告。
三、实验内容
编写一个GUI程序实现日历的功能。
一年日历用12页显示,每页显示一个月的日历。
日历可以按年或月前后翻动,能够显示当前的日期以及当前农历,可以为每页日历选择背景图片。
可以实现显示时钟,时钟能进行整点
报时。
可以实现备忘记事功能,能在每天添加、修改、删除记事等操作。
四、实验步骤
1.在上机实验前,小组成员进行选题讨论,确定小组感兴趣而又伸缩性强的题目多功能日历。
2.在第一次上机实验时讨论分工,分工明确之后,分头合作进行。
3.各成员完成自己的任务后,最后进行统筹合并,以及程序最后的优化。
4. 根据实验结果,写出合肥工业大学实验报告。
实验报告应当包括:实验内容,程序流程图,类结构,程序清单,运行结果,以及通过上机取得的经验。
5.详细的上机实验步骤见任务分工及程序设计进度表。
五、实验结果
经过小组成员的共同努力,最终我们小组设计的多功能日历程序能够实现实验的基本要求——一年日历用12页显示,每页显示一个月的日历。
日历可以按年或月前后翻动,能够显示当前的日期,可以为每页日历选择背景图片。
另外,在完成基本要求的基础上,我们增添了显示农历、显示时钟、添加备忘录、修改备忘录等功能。
整体程序运行流畅、功能齐全、符合操作习惯。
下面是程序运行效果截图:
日历主界面(可以实现每个月的日历,可以按年或按月前后翻动,能够显示当前日期,并能够选择背景图片):
备忘录主界面(实现备忘录的添加,及当前日历的显示):
备忘录主界面(实现备忘录的显示,及对当前备忘录的修改删除等):
时钟主界面(显示当前时间,实现报整点报时功能):
六、实验总结
两周的课程设计结束了,在这其中历尽酸甜苦辣咸各种滋味,不过收获颇丰。
从学习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打开放大查看)所示:
开始
日历主窗口部件初始化,并添加相应监听
文本框输入年份
下拉框选择月份
触发年份监听事
件触发月份监听事
件显示选定年份月
份日历触发背景监听事
件
按钮调节年份
按钮调节月份
显示选定年份月份日历背景
日历主窗口显示(默认为当前日
期)
触发备忘录按钮监听事件
触发时钟按钮事
件
初始化时钟窗口组件,并添加相应监听
监听系统时间
绘制时钟表盘时钟窗口显示整点触发监听事件
整点报时
触发today 按钮事件
初始化备忘录窗口组件,并添加相应监听
是否存在以被选中日期命名的文件
是否存在以被选中日期命名的文件是否保存
是否保存点击今日待办按钮触发今日待办按钮监听事件点击添加按钮
触发添加按钮监听事件
添加记事
显示备忘录窗口
否
保存以当前日期命名的文件
是
文本区显示空白
否
读取该文件并在文本区显示
是
是否删除
是否删除删除文件
是
保持当前状态
否
是否修改
是否修改重写文件
是
否
结束
(2)类图
日历程序类图:
时钟主程序主要包含四个类,其中OurCalender 、MainWin 、ACalender 三个类是都是JFrame 的子类。
OurCalender 里包含程序的入口,Mainwin 主要用来创建窗口对象,ACalender 主要用来创建日历对象,NongLi 主要用来进行农历的显示。
日历程序类图如下所示:
OurCalendar
+MainWin()
+actionPerformed(in e : ActionEvent)
MainWin
+ACalendar()+setYM()+setDay()
+getYear() : int +getMonth() : int +getWeek() : int
+setImg(in month_num : int)
+actionPerformed(in e : ActionEvent)
+Year : JTextField #Month : JComboBox #TheYear : JLabel +TheMonth : JLabel +this_date : Date +Label_title : JLabel +Button_day : JButton +Up1 : JButton +Down2 : JButton +Up2 : JButton +Down1 : JButton +Today : JButton
-background : string +jP : JPanel
+this_year : int +this_month : int - bool : bool
-year_num : string -month_num : int +week : int +day : int ACalendar
+lYearDays(in y : int) : int +leapDays(in y : int) : int +leapMonth(in y : int) : int
+monthDays(in y : int, in m : int) : int +Lunar(in y : int, in m : int) : long
+calElement(in y : int, in m : int, in d : int) : long +getchina(in day : int) : string +shower() : string
NongLi
JFrame
1
1。
时钟类图:
时钟类主要包含DrawClock 和Clock 类,其中DrawClock 类主要是用来创建时钟对象,而Clock 类主要是用来创建窗口对象和时钟监听来进行整点报时。
时钟程序类图如下所示:
+Clock()
Clock JFrame
JPanel
+DrawClock()
+paint(in g : Graphics)
#x : int #y : int #x0 : int #y0 : int #r : int #h : int #w : int #ords_x : int #ords_y : int #ordm_x : int #ordm_y : int #ordh_x : int #ordh_y : int #hh : int #ord_h : int #ang : double #mm : double #ss : double #ord_m : double
#RAD : double = Math.PI/180#set : JButton #icon : Icon DrawClock
JButton
Icon
Graphics
备忘录类图:
备忘录部分主要包含Test 、PoliceListen 、PoliceListen2、MyMenuListener1、Mainwin 等类。
其中MainWin 类主要是用来创建备忘录窗口对象,Test 主要定义备忘录相关的组件以及添加相应的监听事件以实现备忘记事的添加、修改、删除等功能。
PoliceListen 类主要用来定义日历按钮的监听。
PoliceListen2主要是用来定义备忘录中添加按钮的监听。
MyMenuListener1主要是用来定义今日待办事件监听。
MyMenuListener2
mark:boolean
menuCanceled(MenuEvent):void menuDeselected(MenuEvent):void menuSelected(MenuEvent):void
MyWindowListener
mark:int
windowClosing(WindowEvent):void
PoliceListen
x:int y:int
mousePressed(MouseEvent):void mouseReleased(MouseEvent):void mouseEntered(MouseEvent):void mouseExited(MouseEvent):void mouseClicked(MouseEvent):void second():void
Test
year:String month:String day:String hour:String minute:String d:Date
sdf:SimpleDateFormat str:String
stryear:String strday:String strmonth:String strhour:String strminute:String x:String y:String
changeboolean:boolean yesboolean:boolean yearboolean:boolean monthboolean:boolean menubar:JMenuBar nong:NongLi m:String
nltext:JTextField today:JMenu
addbutton:JButton yes:JButton cancel:JButton change:JButton delete:JButton save:JButton cancel1:JButton music:JTextField text1:JTextArea text2:JTextArea text3:JTextArea sldday:JCheckBox sldtime:JCheckBox
yearbox:JComboBox<String>monthbox:JComboBox<String>daybox:JComboBox<String>hourbox:JComboBox<String>minutebox:JComboBox<String>yearlabel:JLabel monthlabel:JLabel
daylabel:mhlabel:JLabel
menulistener1:MyMenuListener1menulistener2:MyMenuListener2policeListen2:Policelistener2Test()
init():void
text1changedUpdate(DocumentEvent):void text1removeUpdate(DocumentEvent):void text1insertUpdate(DocumentEvent):void slddayActionPerformed(ActionEvent):void sldtimeActionPerformed(ActionEvent):void text3changedUpdate(DocumentEvent):void text3removeUpdate(DocumentEvent):void text3insertUpdate(DocumentEvent):void cancelActionPerformed(ActionEvent):void yesActionPerformed(ActionEvent):void
yearboxActionPerformed(ActionEvent):void monthboxActionPerformed(ActionEvent):void todayActionPerformed(ActionEvent):void changeActionPerformed(ActionEvent):void saveActionPerformed(ActionEvent):void cancel1ActionPerformed(ActionEvent):void deleteActionPerformed(ActionEvent):void
PoliceListen2
x:int y:int
mousePressed(MouseEvent):void mouseReleased(MouseEvent):void mouseEntered(MouseEvent):void mouseExited(MouseEvent):void mouseClicked(MouseEvent):void
MyMenuListener1
mark:boolean
menuCanceled(MenuEvent):void menuDeselected(MenuEvent):void menuSelected(MenuEvent):void
MouseListener
MouseListener
JFrame
WindowAdapter
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 void paintComponent(Graphics g){
super.paintComponent(g);
ImageIcon img=new ImageIcon(background);
g.drawImage(img.getImage(),0,0,1150,750,this);
}
}
这里主要用来定义日历的排版布局,给日历添加监听,使其能实现日历的翻页、相关背景的变换、点击日历上相应按钮能显示时钟及备忘录等功能。
Clock.java
import java.awt.*;
import javax.swing.*;
import java.applet.AudioClip;
import java.io.*;
import java.applet.Applet;
import .MalformedURLException;
import .URL;
import java.awt.event.ActionListener; import java.awt.event.ActionEvent;
import java.util.Calendar;
import ng.String;
public class Clock extends JFrame {
public Clock(){
DrawClock dc=new DrawClock();
add(dc,BorderLayout.CENTER);
setSize(640,560);
setVisible(true);
setExtendedState(JFrame.MAXIMIZED_BOTH);
//添加计时器时间间隔为1s
int delay1 = 1000;
ActionListener drawClock1 = new ActionListener(){ public void actionPerformed(ActionEvent evt){
//获取当前时间
Calendar now=Calendar.getInstance() ;
int nowh= now.get(Calendar.HOUR_OF_DAY);
int nowm=now.get(Calendar.MINUTE);
int nows=now.get(Calendar.SECOND);
int noww=now.get(Calendar.DAY_OF_WEEK);
for(int i=0;i<=23;i++){
if(nowh==i && nows==0 && nowm==0){
//System.out.println("123");
try {
StringBuffer s=new StringBuffer("time/");
s.append(Integer.toString(i));
s.append(".wav");
//System.out.println(s);
String st=new String(s);
File f = new File(st);
URL cb= f.toURL();
AudioClip aau;
aau = Applet.newAudioClip(cb);
aau.play();
} catch (MalformedURLException e) {
}
}
}
}
};
new Timer(delay1,drawClock1).start();
}
}
这里主要用来在创建时钟主窗口以及为给是添加监视器啊使其能够完成整点报时的功能。
DrawClock.java
import javax.swing.*;
import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.io.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.util.Date;
public class DrawClock extends JPanel{
//参数定义区
int
x,y,x0,y0,r,h,w,olds_x=-100,olds_y,oldm_x,oldm_y,oldh_x,oldh_y,hh, old_h;//x0,y0圆心
double ang,mm,ss,old_m;
final double RAD=Math.PI/180;//定义弧度、角度转换常数
JButton set;//"设置"按钮
Icon icon;//按钮图片
//DrawClock构造方法
public DrawClock(){
this.setLayout(null);//设置布局为空
icon=new ImageIcon("clock 2.png");
set=new JButton(icon);
set.setMnemonic(KeyEvent.VK_ALT);//设置按钮快捷键为:“Alt”
set.setSize(30,30);//按钮大小
add(set);
set.addActionListener(new ActionListener(){
//按钮添加监听
public void actionPerformed(ActionEvent e){
try {
Process p=Runtime.getRuntime().exec( "control.exe Timedate.cpl");
//调用Windows时间设置
}
catch(Exception m){}
}
});
//添加计时器时间间隔为0.1s
int delay = 100;
ActionListener drawClock = new ActionListener(){ public void actionPerformed(ActionEvent evt){
repaint();//重画界面
}
};
new Timer(delay,drawClock).start();
}
//绘制图像
public void paint(Graphics g){
//参数定义区
Graphics2D g2D = (Graphics2D)g;
//L和T分别是窗口边缘宽度的一半
h = getSize().height;//h为窗口高度
w = getSize().width;
g2D.setColor(Color.white);
//设置前景色
r=h/2-30;//计算半径r的值
x0=w/2+35;
y0=h/2+10; //计算圆心坐标
int fs = r/7; //计算字体大小
//调整窗口大小使合适
//获取当前时间
Calendar now=Calendar.getInstance() ;
int nowh= now.get(Calendar.HOUR_OF_DAY);
int nowm= now.get(Calendar.MINUTE);
int nows= now.get(Calendar.SECOND);
int noww= now.get(Calendar.DAY_OF_WEEK);
//绘制时钟上的60个点
g2D.setStroke(new BasicStroke((1+h/100)/2));
for(int i=1;i<=60;i++){
x=(int)(r*Math.cos(RAD*ang)+x0);
y=(int)(r*Math.sin(RAD*ang)+y0);
g.setColor(Color.BLACK);
g.drawLine(x,y,x,y);
ang-=6;
}
//绘制时钟上的12个数
for(int i=12,ang=270;i>=1;i--){
g.setFont(new Font("Lucida Sans
Unicode",Font.BOLD,fs-20));
x=(int)((r-15)*Math.cos(RAD*ang)+x0);
y=(int)((r-15)*Math.sin(RAD*ang)+y0);
g.drawString(""+i,x-(fs-20)/2,y);
ang-=30;
}
//绘制时钟上的12个点
ang=60;
g2D.setStroke(new BasicStroke(1+h/100));
for(int i=1;i<=12;i++){
x=(int)(r*Math.cos(RAD*ang)+x0);
y=(int)(r*Math.sin(RAD*ang)+y0);
g.drawLine(x,y,x,y);
ang-=30;
}
//在窗体上显示时间
String st;
if(nowh<10) st="0"+nowh;else st=""+nowh;
if(nows%2==0) st+=" ";else st+=":";
if(nowm<10) st+="0"+nowm;else st+=nowm;
g.setFont(new Font("Digital-7 Mono",Font.PLAIN,fs+10));
g.setColor(new Color(180,180,180,180));
g.drawString("88:88",x0-r*3/2,y0-r+fs/2);
g.setColor(Color.BLACK);
g.drawString(st,x0-r*3/2,y0-r+fs/2); //在窗体显示秒数
if(nows<10)
st="0"+nows;
else st=""+nows;
g.setFont(new Font("Digital-7 Mono",Font.PLAIN,fs+10));//样式常量
g.setColor(new Color(180,180,180,180));
g.drawString("88",x0-fs/2,2*r/3+y0);
g.setColor(Color.BLACK);
g.drawString(st,x0-fs/2,2*r/3+y0);
//显示AM、PM
if(nowh<12) st="AM";else st="PM";
g.setFont(new Font("Lucida Sans Unicode",Font.BOLD,fs));
g.setColor(Color.BLACK);
g.drawString(st,x0-fs/2,y0-2*r/3+3*fs/4);
//显示星期
switch (noww) {
case 1: st="Sunday";break;
case 2: st="Monday";break;
case 3: st="Tuesday";break;
case 4: st="Wednesday";break;
case 5: st="Tursday";break;
case 6: st="Friday";break;
case 7: st="Saturday";break;
}
g.setFont(new Font("Lucida Sans Unicode",Font.BOLD,fs)); g.setColor(Color.BLACK);
g.drawString(st,x0-r*3/2,y0-r+3*fs/2);
//计算指针与度数的关系
if(h>=150){
ss=90-nows*6;
mm=90-nowm*6-(0.1*nows);
hh=90-nowh*30-nowm/2;
//擦除秒针
g2D.setStroke(new BasicStroke(2f));
if(olds_x>0){
g.setColor(getBackground());
g.drawLine(x0,y0,olds_x,2*y0-olds_y);
}
else{
old_m = mm;
old_h = hh;
}
//绘制秒针
x=(int)(r*0.9*Math.cos(RAD*ss))+x0;
y=(int)(r*0.9*Math.sin(RAD*ss))+y0;
g.setColor(Color.BLACK);
g.drawLine(x0,y0,x,2*y0-y);
olds_x=x;
olds_y=y;
g2D.setStroke(new BasicStroke(3f));
//擦除分针
if(old_m!=mm){
g.setColor(getBackground());
g.drawLine(x0,y0,oldm_x,2*y0-oldm_y); }
//绘制分针
x=(int)(r*0.7*Math.cos(RAD*mm))+x0;
y=(int)(r*0.7*Math.sin(RAD*mm))+y0;
g.setColor(Color.BLACK);
g.drawLine(x0,y0,x,2*y0-y);
oldm_x=x;
oldm_y=y;
old_m=mm;
g2D.setStroke(new BasicStroke(4f));
//擦除时针
if(old_h!=hh){
g.setColor(getBackground());
g.drawLine(x0,y0,oldh_x,2*y0-oldh_y);
}
//绘制时针
x=(int)(r*0.5*Math.cos(RAD*hh))+x0;
y=(int)(r*0.5*Math.sin(RAD*hh))+y0;
g.setColor(Color.BLACK);
g.drawLine(x0,y0,x,2*y0-y);
oldh_x=x;
oldh_y=y;
old_h=hh;
}
}
}
这里主要用来画时钟的表盘以及数字时钟的显示。
MyMenuListener1.java
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.JTextArea;
import javax.swing.event.MenuListener;
import javax.swing.event.MenuEvent;
import java.awt.*;
import javax.swing.*;
import static javax.swing.JFrame.*;
import java.io.*;
import ng.Exception;
public class MyMenuListener1 implements MenuListener {
static boolean mark;
public void menuCanceled(MenuEvent e) {
}
public void menuDeselected(MenuEvent e) {
Test.text1.setEditable(false);
}
public void menuSelected(MenuEvent e) {
Test.delete.setVisible(true);
Test.change.setVisible(true);
Test.text1.setVisible(true);
Test.text2.setVisible(false);
Test.yes.setVisible(false);
Test.cancel.setVisible(false);
Test.text3.setVisible(false);
Test.sldday.setVisible(false);
Test.yearbox.setVisible(false);
Test.yearlabel.setVisible(false);
Test.monthbox.setVisible(false);
Test.monthlabel.setVisible(false);
Test.daybox.setVisible(false);
Test.daylabel.setVisible(false);
Test.sldtime.setVisible(false);
Test.hourbox.setVisible(false);
Test.mhlabel.setVisible(false);
Test.minutebox.setVisible(false);
Test.yearbox.setSelectedItem(ACalendar.strbuttonyear);
Test.monthbox.setSelectedItem(ACalendar.strbuttonmonth);
Test.daybox.setSelectedItem(ACalendar.strbuttonday);
Test.hourbox.setSelectedItem(Test.strhour);
Test.minutebox.setSelectedItem(Test.strminute);
String
year,month,day,hour,minute,text3length,filename,read_str;
year=Test.yearbox.getSelectedItem()+"";
month=Test.monthbox.getSelectedItem()+"";。