《Java程序设计》课程设计日历记事本

上传人:仙*** 文档编号:27737020 上传时间:2021-08-20 格式:DOC 页数:29 大小:627.06KB
返回 下载 相关 举报
《Java程序设计》课程设计日历记事本_第1页
第1页 / 共29页
《Java程序设计》课程设计日历记事本_第2页
第2页 / 共29页
《Java程序设计》课程设计日历记事本_第3页
第3页 / 共29页
点击查看更多>>
资源描述
2 本科生课程设计 课程名称 Java 程序设计课程设计 课程编号 j1620011 题目 日历记事本 学号 200811622214 学生姓名 所在专业 信息管理与信息系统 所在班级 信管 1082 指导教师 成绩 教师签字 评语: 课程设计时间:2010 年 12 月 20 日-2010 年 12 月 24 日 设计总说明 - 1 - 目 录 摘 要 2 1引 言 2 2. 设计的目的与任 务 2 3设计方 案 3 3.1 总体设 计 3 3.2 设计要 求 3 3.3 系统的主要功 能 设计总说明 - 2 - 3 3.4 各个类的组合结构 图 4 3.5 各个类说 明 4 3.5.1 CalendarWindow 类4 3.5.2 CalendarMessage 类11 3.5.3 CalendarPad 类 13 3.5.4 NotePad 类 14 3.5.5 CalendarImage 类19 3.5.6 Clock 类 20 设计总说明 - 3 - 4各种功能截 图 24 5. 课程设计总 结 26 Java 程序设计课程设计 日历记事本 摘 要 本课程设计通过代码实现将理论知识和具体实践相结合,巩固提高了对 JAVA 的相 关方法与概念的理解,使学生的发散思维及动手能力进一步加强,加强对计算机及软 件工程的进一步了解。 在这个课程设计中,我们做成了一个有日历标记的记事本软件,日历记事本面板 由日历、记事本、图片、时钟四部分组成。日历部分可以选择不同的年份、月份、日 期和星期;记事本模块可以实现查看,保存,删除日志等操作;并且每一步操作都有 相应提示;图片模块可以显示预设的图片;时钟模块可以用时钟来显示当前时间。本 软件是一个实用性较强,简洁,美观,方便的功能软件。 1. 引言 Java 是一种纯面向对象的、网络编程首选的语言。Java 技术作为软件开 的一种 革命性技术,已被列为当今世界信息技术的主流之一。为了适应时代潮流,我们应该 加强对 Java 的学习,更好的掌握这门课程。为此,我们成了一个课程小组,经过小组 成的商讨之后,我们决定以“日历记事本”为设 题材,借此巩固加深我们对 Java 的了解。 设计总说明 - 4 - 本次课程设计的实例虽然比较简单,程序设计也不是很复杂,但在此程序的设计 过程也是一个学习过程,更是对复杂程序的一个学习过程,还能培养我们的数抽象能 力。因此,我们觉得这次课程设计是非常有意义的,能为我们今后学习面向过程的程 序设计作一些铺垫。 2.设计目的与任务 本课程设计所要求达到的目的和任务:通过 Java 程序设计的一些重要理论基础来实现 “日 历记事本”的“日历”和“记事本”的双重功能。并通过此次课程设计的训练,使学生巩固和 加深对 Java 这门课程的理解,通过利用所学到的计算科学的理论知识,提高解决实际问题的能 力,增强运算、编程和使用技术资料的技能,通过实际问题的分析设计、编程和调试,掌握应 用软件的分析方法和工程设计方法,能正确阐述设计和实验结果。通过这次课程设计,培养实 事求是、认真、严谨的科学态度和刻苦钻研不断创新的精神,逐步建立正确的全局观念。 3.设计方案 3.1 总体设计 (1)问题定义:创建日历记事本,实现对某日期的事情进行记录这主要功能,并能 显示设置的图片和时钟,增加美观。 (2)问题分析:通过对“日历记事本”这一题材的分析,我需要四个类来实现其 “日历”和“记事本”这两大功能。通过主类 CalendWindow 创建动日历记事本软件的 主窗口,该类含有 main 方法,程序从该类开始执行。再用余下 CalendarPad、 CalendarMessage 、NotePad 类来显示并改变日期和实现记事本的功能。 而 CalendarImage 和 Clock 这两个类用来显示图片和时钟。 (3)研究意义:通过本次课程设计,我们掌握了 Java 语言的基本运用,提高了理论结 合实际的能力。 3.2 设计要求 (1)界面的左侧是日历和一幅图。该日历可以按年前后翻动,用鼠标鼠标单击“上 年”按钮时,当前日历的年份将减一;当鼠标左键单击“下年”按钮,当前日历的年份将 加一。该日历还可以在某年内按月前月后翻动,当鼠标左键单击“上月”按钮时, 当前日 历的月份将减一;当鼠标左键单击“下月” 当前日历表的月份将加一。图片是为了增加 美观而加进去的。 (2)系统界面的右侧是记事本和一个闹钟。用鼠标单击日历上的日期,就可以通过 该记事本编辑有关日志,并将日志保存到一个文件,该文件的名字由该日期组成的字 设计总说明 - 5 - 符序列命名。用户可以查看,删除某个日期的日志,也可以继续向某个日志添加新内 容。 时钟能够实时显示当前的时间。 (3)当某个日期有日志时,在日历表该日期的外观上就会出现“yes”标记,表明 这个日期有日志,当用户删除某个日期的日志后,该日期的外观上“yes”标志就会消 失。 3.3 系统的主要功能 (1)可以对个人日志进行添加、查阅、删除; (2)可以方便地在任何日期记载个人日志以及查看某个日期记载的日志 ; (3)可以显示当前日期与时间。 3.4 各个类的组合结构图 3.5 各个类说明 (1)主函数 CalendarWindow 类 该类是整个程序的主框架,是 javax.swing 包中 Jframe 的一个子类。并实现了 ActionListener、MouseListener 和 FocusListener 接口。以下是该类的有关数据说明! 1)成员变量 year,month 和 day 是 int 型变量。它们的值分别确定年份、月份和日期。 CalendarWindow CalendarMessage CalendarImage CalendarPad JTextField FileNotePad JTextArea Clock 设计总说明 - 6 - calendarMessage 是 CalnedarMessage 对象,该对象用来处理与日期有关的数据。 calendarPad 是 CalendarPad 对象,该对象可以显示与日期有关的数据。 notPad 是 NotPad 的对象。具有编辑、读取、保存和删除日志的功能。 showYear 和 showMonth 是 JtextField 类创建的文本框,用来显示年月。 showDay 数组的每个单元是 JtextField 类创建的用来显示日期的文本框。 calendarImage 是 CalendarImage 创建的对象,用来显示图像。 clock 是 Clock 创建的对象,用来显示时钟。 nextYear,PreviousYear,nextMonth 和 PreviousMonth 是 JButton 创建的按钮 对象,名字依次为“下年、上年、下月、上月” 。这些按钮都将当前窗口注册为自 己的 ActionEvent 事件监视器。 savaDailyRecord,deleteDailyRecord 和 readDailyRecord 是 JButton 创建的按 钮对象,名字依次为“保存日志、删除日志、读取日志” 。这些按钮都将当前窗口 注册为自己的 ActionEvent 事件监视器。 2)方法 CalendarWindow()是构造方法,负责完成窗口初始化。 actionPerformed(ActionEvent)方法是 CalendarWindow 类实现的 ActionListener 接口中的方法。CalendarWindow 创建的窗口是 nextYear,previousYear,nextMonth,previousMonth,saveDailyRecord,d eleteDailyRecord 和 readDailyRecord 按钮的 ActionEvent 事件监视器,当用 户单击其中按钮时,窗口将执行 actionPerformed(ActionEvent)方法进行相 应的操作。 mousePressed(MouseEvent)方法是 CalendarWindow 类实现的 MouseListener 接口中的方法。CalendarWindow 创建的窗口时 showDay 数组中的 JtextField 文本框的 MouseEvent 事件监视器,当用户在某个显示日期的文本框上按下鼠 标左键时,窗口将执行 mousePress(MouseEvent)方法进行相应操作。 focusGained(FocusEvent)和 focusLost(FocusEvent)方法是 CalendarWindow 类实现的 FocusListener 接口中的方法。CalendarWindow 创 建窗口是 showDay 数组中的 JtextField 文本框的 FocusEvent 事件监视器,当 用户的操作导致某个显示日期的文本框的焦点发生变化时,窗口将执行 focusGained(FocusEvent)或 focusLost(FocusEvent)方法进行相应的操作。 doMark()方法负责对有日志的日期作出标志。 main 方法是程序运行的入口方法。 设计总说明 - 7 - 详细代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; public class CalendarWindow extends JFrame implements ActionListener, MouseListener,FocusListener int year,month,day; CalendarMessage calendarMessage; CalendarPad calendarPad; NotePad notePad; JTextField showYear,showMonth; JTextField showDay; CalendarImage calendarImage; Clock clock; JButton nextYear,previousYear,nextMonth,previousMonth; JButton saveDailyRecord,deleteDailyRecord,readDailyRecord; File dir; Color backColor=Color.white; public CalendarWindow() dir= new File(./dailyRecord); dir.mkdir(); showDay = new JTextField42; for(int i=0;i12) month=1; showMonth.setText(+month); calendarPad.setCalendarMessage(calendarMessage); calendarPad.showMonthCalendar(); notePad.setShowMessage(year,month,day); doMark(); else if (e.getSource()=previousMonth) 设计总说明 - 10 - month-; if(month1) month=12; showMonth.setText(+month); calendarPad.setCalendarMessage(calendarMessage); calendarPad.showMonthCalendar(); notePad.setShowMessage(year,month,day); doMark(); else if (e.getSource()=showYear) String s = showYear.getText().trim(); char a = s.toCharArray(); boolean boo = false; for(int i = 0;i a.length;i+) if(!(Character.isDigit(ai) boo = true; if(boo=true) JOptionPane.showMessageDialog(this,你输入了非法年份,警告!, JOptionPane.WARNING_MESSAGE); else if(boo=false) year = Integer.parseInt(s); showYear.setText(+year); calendarMessage.setYear(year); calendarPad.setCalendarMessage(calendarMessage); calendarPad.showMonthCalendar(); notePad.setShowMessage(year,month,day); doMark(); else if (e.getSource()= saveDailyRecord) notePad.save(dir,year,month,day); doMark(); else if(e.getSource()=deleteDailyRecord) notePad.delete(dir,year,month,day); doMark(); else if (e.getSource()=readDailyRecord) notePad.read(dir,year,month,day); 设计总说明 - 11 - doMark(); public void mousePressed(MouseEvent e) JTextField text = (JTextField)e.getSource(); String str = text.getText().trim(); try day = Integer.parseInt(str); catch (NumberFormatException exp) calendarMessage.setDay(day); notePad.setShowMessage(year,month,day); public void mouseReleased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public void mouseClicked(MouseEvent e) public void focusGained(FocusEvent e) Component com = (Component)e.getSource(); com.setBackground(Color.pink); public void focusLost(FocusEvent e) Component com = (Component)e.getSource(); com.setBackground(backColor); public void doMark() for(int i=0;ishowDay.length;i+) showDayi.removeAll(); String str = showDayi.getText().trim(); try int n = Integer.parseInt(str); if(isHaveDailyRecord(n)=true) 设计总说明 - 12 - JLabel mess = new JLabel(yes); mess.setFont(new Font(TimesRoman,Font.PLAIN,11); mess.setForeground(Color.blue); showDayi.add(mess); catch (Exception exp) calendarPad.repaint(); calendarPad.validate(); public boolean isHaveDailyRecord(int n) String key = +year+month+n; String dayFile = dir.list(); boolean boo = false; for(int k = 0;kdayFile.length;k+) if(dayFilek.equals(key+.txt) boo = true; break; return boo; public static void main(String args) new CalendarWindow(); (2)CalendarMessage 类 CalendarMessage 类创建的对象 calendarMessage 是 CalendarWindow 窗口的重要成员 对象之一,负责处理和日期有关的数据。该类的有关数据说明如下: 1)成员变量 year,month,day 是 int 型数据,它们的值分别确定年份、月份和日期。 2)方法 设计总说明 - 13 - setYear(int)和 getYear()方法分别用来设置 year 和获取 year 的值。 setMonth(int)和 getMonth()方法分别用来设置 month 和获取 month 的值。 setDay(int)和 getDay()方法分别用来设置和获取 day 的值。 getMonthCalendar()方法是用来处理日期数据,使其按着习惯来显示。即日 历牌中每行的第一列为“星期天” 。getMonthCalendar()方法根据 year,month 和 day 的值返回一个存放着“日历”数据的 String 类型的数组, 例如,如果某月有 30 天,而且该月的第一天是星期三,那么返回的 String 类 型的数组是:“” , “”, “”, “1”, “2”, “30”。 详细代码: import java.util.Calendar; public class CalendarMessage int year=-1,month=-1,day=-1; public void setYear(int year) this.year=year; public int getYear() return year; public void setMonth(int month) if(month=1) this.month=month; else this.month=1; public int getMonth() return month; public void setDay(int day) this.day=day; public int getday() return day; public String getMonthCalendar() String day=new String42; Calendar rili=Calendar.getInstance(); 设计总说明 - 14 - rili.set(year,month-1,1);/将日历翻到 year 年 month 月 1 日 int 星期几=rili.get(Calendar.DAY_OF_WEEK)-1; int dayAmount=0; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12) dayAmount=31; if(month=4|month=6|month=9|month=11) dayAmount=30; if(month=2) if(year%4=0) else dayAmount=28; for(int i=0;i星期几;i+) dayi= ; for(int i=星期几,n=1;i星期几+dayAmount;i+) dayi=String.valueOf(n); n+; for (int i=星期几+dayAmount;i42;i+ ) dayi= ; return day; (3)CalendarPad 类 CalendarPad 类是 javax.swing 包中 Jpanel 容器的子类,所创建的对象:calendarPad 是 CalendarWindow 类中最重要的成员之一,负责显示经 CalendarMessage 类处理后的 日期数据,被添加到 CalendarWindow 窗口的左上侧。以下是该类的有关说明: 1)成员变量 year,month 和 day 是 int 型数据,它们的值分别确定年份、月份和日期 calendarMessage 是 CalendarMessage 对象,该对象可以处理和日期有关的数 据。 showDay 数组的每个单元是 JtextField 类创建的用来显示日期的文本框。 “星期”是 String 数组,单元的值依次为“SUN 日” 、 “MON 一” 、 “TUE 二” 、 “WED 三” 、 “THU 四” 、 “FRI 五” 、 “SAT 六” 。 2)方法 CalendarPad()是构造方法,用来创建 calendarPad 对象。 setShowDayTextField(JtextField)方法负责设置 showDay 数组。 设计总说明 - 15 - setCalendarMessage(CalendarMessage)方法负责设置 calendarMessage 对象。 showMonthCalendar()方法负责显示“日历” 。 详细代码: import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.*; public class CalendarPad extends JPanel int year,month,day; CalendarMessage calendarMessage; JTextField showDay; JLabel title ; String 星期=SUN 日,MON 一,TUE 二,WED 三,THU 四,FRI 五,SAT 六; JPanel north,center; public CalendarPad() setLayout(new BorderLayout(); north=new JPanel(); north.setLayout(new GridLayout(1,7); center=new JPanel(); center.setLayout(new GridLayout(6,7); add(center,BorderLayout.CENTER); add(north,BorderLayout.NORTH); title=new JLabel7; for(int j=0;j7;j+) titlej=new JLabel(); titlej.setFont(new Font(TimesRoman,Font.BOLD,12); titlej.setText(星期j); titlej.setHorizontalAlignment(JLabel.CENTER); titlej.setBorder(BorderFactory.createRaisedBevelBorder(); north.add(titlej); title0.setForeground(Color.red); title6.setForeground(Color.blue); public void setShowDayTextField(JTextField text) showDay=text; for(int i=0;ishowDay.length;i+) showDayi.setFont(new Font(TimesRoman,Font.BOLD,15); showDayi.setHorizontalAlignment(JTextField.CENTER); showDayi.setEditable(false); center.add(showDayi); 设计总说明 - 16 - public void setCalendarMessage(CalendarMessage calendarMessage) this.calendarMessage=calendarMessage; public void showMonthCalendar() String a=calendarMessage.getMonthCalendar(); for(int i=0;i42;i+) showDayi.setText(ai); validate(); (4)NotePad 类 NotePad 类 javax.swing 包中的 Jpanel 容器的子类,实现了 ActionListener 接口,所创建 的对象:notePad 是 MineGame CalendarWindow 类中的重要成员之一,作为一个容器添 加到 CalendarWindow 窗口的右上侧以,下是该类的有关说明: 1)成员变量 text 是 JtextArea 创建的文本区,可在 text 中编译多行文本。 showMessage 是 JtextField 创建的文本条,用来显示和日期相关的数据。 menu 是 JpopupMenu 创建的弹出式菜单。 itemCopy、itemCut、itemPaste、itemClear 是 JmenuItem 创建的菜单项,名字 依次是“复制 ”, “剪切”, “黏贴”, “清空”。 2)方法 NotePad()构造方法,用来创建 notePad 对象。 setShowMessage(int,int,int)方法根据参数指定的日期数据显示有关日期信 息。 save(File,int,int, int)方法根据参数指定日期保存日志 delete(File ,int,int ,int) 用于删除日志 read(File ,int,int, int)用于读取日志。 详细代码: import java.awt.*; import javax.swing.*; import java.io.*; import java.awt.event.*; public class NotePad extends JPanel implements ActionListener JTextArea text; JTextField showMessage; JPopupMenu menu; JMenuItem itemCopy,itemCut,itemPaste,itemClear; public NotePad() 设计总说明 - 17 - showMessage=new JTextField(); showMessage.setHorizontalAlignment(JTextField.CENTER); showMessage.setFont(new Font(TimesRoman,Font.BOLD,16); showMessage.setForeground(Color.blue); showMessage.setBackground(Color.pink); showMessage.setBorder(BorderFactory.createRaisedBevelBorder(); showMessage.setEditable(false); menu =new JPopupMenu(); itemCopy=new JMenuItem(复制); itemCut=new JMenuItem(剪切); itemPaste=new JMenuItem(粘贴); itemClear=new JMenuItem(清空); itemCopy.addActionListener(this); itemCut.addActionListener(this); itemPaste.addActionListener(this); itemClear.addActionListener(this); menu.add(itemCopy); menu.add(itemCut); menu.add(itemPaste); menu.add(itemClear); text=new JTextArea(10,10); text.addMouseListener(new MouseAdapter() public void mousePressed(MouseEvent e) if(e.getModifiers()=InputEvent.BUTTON3_MASK) menu.show(text,e.getX(),e.getY(); ); setLayout(new BorderLayout(); add(showMessage,BorderLayout.NORTH); add(new JScrollPane(text),BorderLayout.CENTER); public void setShowMessage(int year,int month, int day) showMessage.setText(+year+年+month+月+day+日); public void save(File dir,int year,int month,int day) String dailyContent=text.getText(); String fileName=+year+month+day+.txt; String key=+year+month+day; String dayFile=dir.list(); boolean boo=false; for(int k=0;kdayFile.length;k+) if(dayFilek.startsWith(key) boo=true; 设计总说明 - 18 - break; if(boo) String m=+year+年+month+月+day+ 已有日志,将新内容添加到日志吗? ; int ok=JOptionPane.showConfirmDialog(this, m, 询问, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if(ok=JOptionPane.YES_OPTION) try File f=new File(dir,fileName); RandomAccessFile out=new RandomAccessFile(f,rw); long fileEnd=out.length(); byte bb=dailyContent.getBytes(); out.seek(fileEnd); out.write(bb); out.close(); catch(IOException exp) else String m=+year+年+month+月+day+ 还没有日志,保存日志吗 ?; int ok=JOptionPane.showConfirmDialog(this, m, 询问,JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if(ok=JOptionPane.YES_OPTION) try File f=new File(dir,fileName); RandomAccessFile out= new RandomAccessFile(f,rw); long fileEnd=out.length(); byte bb=dailyContent.getBytes(); out.write(bb); out.close(); catch(IOException exp) public void delete(File dir,int year,int month,int day) String key =+year+month+day; String dayFile=dir.list(); boolean boo=false; for(int k=0;kdayFile.length;k+) if(dayFilek.startsWith(key) 设计总说明 - 19 - boo=true; break; if(boo) String m=删除+year+年+month+月+day+ 日的日志吗?; int ok=JOptionPane.showConfirmDialog(this,m,询问 ,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); if(ok=JOptionPane.YES_OPTION) String fileName=+year+month+day+.txt; File deleteFile=new File(dir,fileName); deleteFile.delete(); else String m=+year+年+month+月+day+无日志记录; JOptionPane.showMessageDialog(this,m,提示,JOptionPane.WARNING_MESSAGE); public void read(File dir,int year,int month,int day) String fileName=+year+month+day+.txt; String key=+year+month+day; String dayFile=dir.list(); boolean boo=false; for(int k=0;kdayFile.length;k+) if(dayFilek.startsWith(key) boo=true; break; if(boo) String m=+year+年+month+月+day+ 有日志,显示日志内容吗 ?; int ok=JOptionPane.showConfirmDialog(this,m,询问 ,JOptionPane.YES_NO_OPTION,JOptionPane.QUESTION_MESSAGE); if(ok=JOptionPane.YES_OPTION) text.setText(null); try File f=new File(dir,fileName); FileReader inOne=new FileReader(f); BufferedReader inTwo=new BufferedReader(inOne); String s=null; while (s=inTwo.readLine()!=null) text.append(s+n); 设计总说明 - 20 - inOne.close(); inTwo.close(); catch(IOException exp) else String m=+year+年+month+月+day+ 无日志记录 ; JOptionPane.showMessageDialog(this,m,提示,JOptionPane.WARNING_MESSAGE); public void actionPerformed(ActionEvent e) if(e.getSource()=itemCopy) text.copy(); else if(e.getSource()=itemCut) text.cut(); else if(e.getSource()=itemPaste) text.paste(); else if(e.getSource()=itemClear) text.setText(null); (5)CalendarImage 类 CalendarImage 创建的对象负责绘制图像 CalendarImage 类是 javax.swing 包中 Jpanel 容器的一个子类,创建的对象 calendarMessage 是 CalendarWindow 类的成员之一,负责绘制图像,作为一个容器添加 到 CalendarWindow 窗口的左下侧,以下是该类的有关说明: 1) 成员变量 imageFile 是 File 对象,用来存放图像文件的引用 image 是 Image 对象 tool 是 Tookit 对象,负责创建 image 对象 2) 方法 CalendarImage()是构造方法,负责创建 calendarImage 对象 setImageFile(File)方法负责设置 imageFile 对象,并根据 imageFile 创建 image paintComponent(Griphics)方法负责绘制 image 详细代码: import javax.swing.*; 设计总说明 - 21 - import java.io.*; import java.awt.*; public class CalendarImage extends JPanel File imageFile; Image image; Toolkit tool; CalendarImage() tool = getToolkit(); public void setImageFile(File f) imageFile = f; try image = tool.getImage(imageFile.toURI().toURL(); catch (Exception e) repaint(); public void paintComponent(Graphics g) super.paintComponent(g); int w = getBounds().width; int h = getBounds().height; g.drawImage(image,0,0,w,h,this); (6)Clock 类 Clock 类是 javax.swing 包中 Jpanel 容器的子类,并实现了 ActionListener 接口,所创建 的对像:clock 是 CalendarWindow 类中的成员之一,负责显示时间,被添加到 CalendarWindow 窗口的右下侧,以下是该类的有关说明: 1) 成员变量 date 是 Date 对像,负责封装本地时间 secondTime 是 javax.swing 包中 Timer 类创建的计时 hour,minute 和 second 是 int 型数据,分别飞“小时” , “分钟”和“秒” 设计总说明 - 22 - secondLine,minuteLine 和 hourLine 是 Lint2D 对象,分别负责绘制“时针” , “分针” , “秒针” pointSX, pointSY 是 double 型数组,其单元值用来表示秒针端点的坐标 pointMX,pointMY 是 double 型数组,其单元值用来表示分针端点坐标 pointHX,pointHY 是 double 型数组,其单元值用来便是时针端点坐标 2) 方法 Clock()是构造方法,用来创建 clock 对象 initPoint()负责创建表盘所需要的坐标点 paintComponent(Graphics)负责完成绘制工作 actionPerformed(ActionEvent)是接口 ActionListener 中的方法。使用 Timer 类 的构造方法:timer(int a ,Object b )创建一个计时器,其中的参数 a 的单 位是毫秒,确定计时器每隔 a 毫秒“振铃”一次,参数 b 是计时器的监视器。 计时器发生的振铃时件是 ActionEvent 类型时件,当振铃时间发生时,监视器 就会监视到这个事件,监视器就会回调用 ActionListener 接口中的 actionPerformed(ActionEvent)方法,该方法所做的操作是:每隔 1 秒钟,让秒 针前进一个刻度,既 secondLine 改变端点坐标;每隔 1 分钟,让分针前进一个 刻度(表盘一周为 360,每个时刻为 6) ,既 muniteLine 改变端点坐标;每 隔 12 分钟,让时针前进一个刻度,既 hourLine 改变端点坐标。 详细代码: import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.awt.geom.*; import java.util.*; public class Clock extends JPanel implements ActionListener Date date; javax.swing.Timer secondTime; int hour,munite,second; Line2D secondLine,muniteLine,hourLine; int a,b,c,width,height; double pointSX = new double60, pointSY = new double60, pointMX = new double60, pointMY = new double60, pointHX = new double60, pointHY = new double60; Clock() 设计总说明 - 23 - setBackground(Color.cyan); initPoint(); secondTime = new javax.swing.Timer(1000,this); secondLine = new Line2D.Double(0,0,0,0); muniteLine = new Line2D.Double(0,0,0,0); hourLine = new Line2D.Double(0,0,0,0); secondTime.start(); private void initPoint() width = getBounds().width; height = getBounds().height; pointSX0 = 0; pointSY0 = -(height/2*5/6); pointMX0 = 0; pointMY0 = -(height/2*4/5); pointHX0 = 0; pointHY0 = -(height/2*2/3); double angle = 6*Math.PI/180; for(int i = 0;i59;i+) pointSXi+1 = pointSXi*Math.cos(angle) - Math.sin(angle)*pointSYi; pointSYi+1 = pointSYi*Math.cos(angle) + pointSXi*Math.sin(angle); pointMXi+1 = pointMXi*Math.cos(angle) - Math.sin(angle)*pointMYi; pointMYi+1 = pointMYi*Math.cos(angle) + pointMXi*Math.sin(angle); pointHXi+1 = pointHXi*Math.cos(angle) - Math.sin(angle)*pointHYi; pointHYi+1 = pointHYi*Math.cos(angle) - pointHXi*Math.sin(angle); for(int i = 0;i60;i+) pointSXi = pointSXi+width/2; pointSYi = pointSYi+height/2; pointMXi = pointMXi+width/2; pointMYi = pointMYi+height/2; pointHXi = pointHXi+width/2; pointHYi = pointHYi+height/2; public void paintComponent(Graphics g) super.paintComponent(g); initPoint(); 设计总说明 - 24 - for(int i = 0;i60;i+) int m = (int)pointSXi; int n = (int)pointSYi; if(i%5 =0) if(i=0|i=15|i=30|i=45) int k = 10; g.setColor(Color.orange); g.fillOval(m-k/2,n-k/2,k,k); else int k = 7; g.setColor(Color.orange); g.fillOval(m-k/2,n-k/2,k,k); else int k =2; g.setColor(Color.black); g.fillOval(m-k/2,n-k/2,k,k); g.fillOval(width/2-5,height/2-5,10,10); Graphics2D g_2d = (Graphics2D)g; g_2d.setColor(Color.red); g_2d.draw(secondLine); BasicStroke bs = new BasicStroke(2f,BasicStroke.CAP_ROUND,BasicStroke.JOIN_MITER); g_2d.setStroke(bs); g_2d.setColor(Color.blue); g_2d.draw(muniteLine); bs = new BasicStroke(4f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g_2d.setStroke(bs); g_2d.setColor(Color.orange); g_2d.draw(hourLine); bs = new BasicStroke(8f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_MITER); g_2d.setStroke(bs); public void actionPerformed(ActionEvent e) 设计总说明 - 25 - if(e.getSource()= secondTime) date = new Date(); String s = date.toString(); hour = Integer.parseInt(s.substring(11,13); munite = Integer.parseInt(s.substring(14,16); second = Integer.parseInt(s.substring(17,19); int h = hour%12; a = second; b = munite; c = h*5+munite/12; secondLine.setLine(width/2,height/2,(int)pointSXa,(int)pointSYa); muniteLine.setLine(width/2,height/2,(int)pointMXb,(int)pointMYb); hourLine.setLine(width/2,height/2,(int)pointHXc,(int)pointHYc); repaint(); 4各种功能截图 主界面 添加日志 设计总说明 - 26 - 附 录 2
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸下载 > CAD图纸下载


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!