JAVA万年历课程设计实训报告.pdf

上传人:叶*** 文档编号:36108974 上传时间:2022-08-25 格式:PDF 页数:24 大小:705.04KB
返回 下载 相关 举报
JAVA万年历课程设计实训报告.pdf_第1页
第1页 / 共24页
JAVA万年历课程设计实训报告.pdf_第2页
第2页 / 共24页
点击查看更多>>
资源描述

《JAVA万年历课程设计实训报告.pdf》由会员分享,可在线阅读,更多相关《JAVA万年历课程设计实训报告.pdf(24页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、成绩:本科专业实训报告课题名称:java万年历设计院系专业:信息工程学院通信工程专业学号姓名:0967119104李少华指导教师:赵建峰完成日期:2012年6月 28 日星期 四1报告正文报告正文一、简介一、简介(1)选题依据:本次课程设计为自选题。思考一段时间后,我决定做一个万年历的设计。主要考虑到自己 JAVA 课程基础内容掌握并不是很扎实。而而对于设计一个万年历程序,由于其功能简单设计也相对较易,并且通过设计这样的一个日历小组件,也能使自己对 JAVA 的一些基础知识掌握的更加牢固。(2)课题基本内容:这个项目是一个简单的 Java 万年历,可以实现年份为四位数的公历日期的查询,并且在相

2、应的日期做备忘录,以及可以显示当前的系统日期以及时间。二、主要问题二、主要问题(1)各个 Jpanel 的布局问题。本程序中有五个 Jpanel。如何使各个容器的布局合理是首要关心的问题;(2)所选月份天数的算法;(3)所选月份第一天为星期几的算法;(4)输出所选月份该月日历的算法;(5)在选择项中加入 showMessageDialog 的问题。三、研究方法三、研究方法(1)各个 Jpanel 的布局问题:针对这个问题,使用 BorderLayout 类。这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件

3、,并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。当使用边框布局将一个组件添加到容器中时,要使用这五个常量之一。(2)所选月份天数的算法:用 if 语句实现。一三五七八十二月份为 31 天,四六九十一月份为 30 天,对于二月份进行闰年与非闰年的讨论。(3)所选月份第一天为星期几的算法:使用get(Calendar.DAY_OF_WEEK)函数实现。(4)输出所选月份该月日历的算法:算出所选月份第一天为星期几后,把该日期以前的位置用空格补上,并从该日起一次输出天数直到月底。从前面的空格2开始算起,把第一天的星期数字减去 1 后即为此天在该序列中的序号,从此天

4、开始算,利用该序列的序号对 6 取余得 0 换行,即可完整的输出该月的日历。(5)在选择项中加入 showMessageDialog 的问题:在本程序中,首先定义了关于 “版本说明” 的适配器, 在这个类中定义了这个选择项的 actionPerformed 方法。其次,在主程序中为“版本说明”选择项加一个监听器,监听器中调用了刚才定义的适配器。最后,同样在主程序中详细说明 actionPerformed 方法。四、数据分析四、数据分析package wannianli;import java.awt.*;import java.awt.event.ActionEvent;import java

5、.awt.event.ActionListener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOExceptio

6、n;import java.io.InputStreamReader;import java.io.OutputStreamWriter;/import java.sql.Date;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;importjava.util.Date;import javax.swing.Icon;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFr

7、ame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;3import javax.swing.JTextArea;import javax.swing.JTextField;import javax.s

8、wing.table.DefaultTableModel;public class wannianli extends JFrameimplements ActionListener,MouseListenerprivate Calendar cld = Calendar.getInstance();private String astr = 星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日;privateDefaultTableModeldtm=newDefaultTableModel(null,astr);private JTable table = new JTable

9、(dtm);/装日期的表格private JScrollPane sp = new JScrollPane(table);private JButton bLastYear = new JButton(上一年);private JButton bNextYear = new JButton(下一年);private JButton bLastMonth = new JButton(上月);private JButton bNextMonth = new JButton(下月);private JTextField jtfYear = new JTextField(5);/jtfYear 年份显

10、示和输入文本框,允许编辑单行文本private JTextField jtfMonth = new JTextField(2);/jtfMonth 月份显示文本框private JPanel p1 = new JPanel();/装入控制日期按钮的模块private JPanel p2 = new JPanel();private JPanel p3 = new JPanel(new BorderLayout();private JPanel p4 = new JPanel(new GridLayout(2,1);private JPanel p5 = new JPanel(new Borde

11、rLayout();private JButton bAdd = new JButton(保存日志);private JButton bDel = new JButton(删除日志);privateJTextAreajta=newJTextArea();/JTextArea 是一个显示纯文本的多行区域private JScrollPane jsp = new JScrollPane(jta);/管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口private JLabel l = new JLabel(小提示:可直接输入年份,提高查询效率!);private JLabel lt = ne

12、w JLabel();/系统时间4private JLabel ld = new JLabel();/日期是否被选择private int lastTime;JMenuBar jmb = new JMenuBar();JMenuview;publicwannianli()super(万年历); /框架命名view = new JMenu(关于);JMenuItem banben = new JMenuItem(版本说明);banben.addActionListener(newbanben_actionAdapter(this);view.add(banben);jmb.add(view);t

13、his.setJMenuBar(jmb);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/ 窗口关闭函数this.getContentPane().setLayout(new BorderLayout(10,0);jta.setLineWrap(true);/获取文本区的换行策略。如果设置为true,则当行的长度大于所分配的宽度时,将换行。如果设置为 false,则始终不换行。table.setGridColor(Color.BLACK);/星期之间的网格线是黑色的table.setColumnSelectionAllowed(true

14、);table.setSelectionBackground(Color.BLACK);/当选定某一天时这一天背景黑色table.setSelectionForeground(Color.YELLOW);/选定的日期字体是黄色的table.setBackground(new Color(200,255,255);/日期显示表格颜色table.setFont(new Font(黑体,Font.BOLD,24);/日期数字字体格式table.setRowHeight(30);/表格的高度table.addMouseListener(this);/鼠标监听器jtfYear.addActionList

15、ener(this);/可输入年份的文本框/为各个按钮添加监听函数bAdd.addActionListener(this);bDel.addActionListener(this);bLastYear.addActionListener(this);bNextYear.addActionListener(this);5bLastMonth.addActionListener(this);bNextMonth.addActionListener(this);/将按钮添加到 Jpanel 上p1.add(bLastYear);p1.add(jtfYear);/年份输入文本框p1.add(bNext

16、Year);p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p2.add(bAdd);p2.add(bDel);p3.add(jsp, BorderLayout.CENTER);p3.add(p2, BorderLayout.SOUTH);p3.add(ld, BorderLayout.NORTH);p4.add(l);p4.add(lt);p5.add(p4, BorderLayout.SOUTH);p5.add(sp, BorderLayout.CENTER);p5.add(p1, BorderLayout.NORTH);thi

17、s.getContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p3, BorderLayout.EAST);String strDate = DateFormat.getDateInstance().format(newDate().split(-);/获得日期cld.set(Integer.parseInt(strDate0),Integer.parseInt(strDate1)-1, 0);showCalendar(Integer.parseInt(strDate0),Integer.parseInt(s

18、trDate1), cld);jtfMonth.setEditable(false);/设置月份的文本框为不可编辑jtfYear.setText(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(新宋体,Font.BOLD,24);new Timer(lt).start();this.setBounds(200,200,600,320);this.setResizable(false);this.setVisible(true);public void showCalenda

19、r(int localYear, int localMonth, Calendarcld)6intDays=getDaysOfMonth(localYear,localMonth)+cld.get(Calendar.DAY_OF_WEEK) - 2;Object ai = new Object7;lastTime = 0;for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i = Days; i+)aii%7=String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2);/返回一个表示指定的 int 值的 Inte

20、ger 实例if (i%7 = 6)dtm.addRow(ai);ai = new Object7;lastTime+;dtm.addRow(ai);public int getDaysOfMonth(int year, int Month)/显示所选月份的天数if(Month = 1 | Month = 3 | Month = 5 | Month = 7 |Month = 8 | Month = 10 | Month = 12)return 31;if(Month = 4 | Month = 6 | Month = 9 | Month = 11)return 30;if(year%4 = 0

21、 & year%100 != 0 | year%400 = 0)/闰年return 29;elsereturn 28;public void actionPerformed(ActionEvent e)7if(e.getSource() = jtfYear | e.getSource() = bLastYear |e.getSource() = bNextYear |e.getSource() = bLastMonth | e.getSource() =bNextMonth)int m, y;try/控制输入的年份正确,异常控制if (jtfYear.getText().length() !=

22、 4)throw new NumberFormatException();y = Integer.parseInt(jtfYear.getText();m = Integer.parseInt(jtfMonth.getText();catch (NumberFormatException ex)JOptionPane.showMessageDialog(this, 请输入 4 位0-9 的数字!, 年份有误, JOptionPane.ERROR_MESSAGE);return;ld.setText(没有选择日期);for (int i = 0; i lastTime+1; i+) dtm.re

23、moveRow(0);if(e.getSource()=bLastYear) jtfYear.setText(String.valueOf(-y); if(e.getSource()=bNextYear)jtfYear.setText(String.valueOf(+y); if(e.getSource() = bLastMonth)if(m = 1)jtfYear.setText(String.valueOf(-y);m = 12;jtfMonth.setText(String.valueOf(m);elsejtfMonth.setText(String.valueOf(-m);if(e.g

24、etSource() = bNextMonth)if(m = 12)8jtfYear.setText(String.valueOf(+y);m = 1;jtfMonth.setText(String.valueOf(m);elsejtfMonth.setText(String.valueOf(+m);cld.set(y, m-1, 0);showCalendar(y, m, cld);if(e.getSource() = bAdd)int r = table.getSelectedRow();int c = table.getSelectedColumn();if(!ld.getText().

25、equals(没有选择日期)tryFile file = new File(ld.getText() + .txt);BufferedWriterbw=newBufferedWriter(newOutputStreamWriter(new FileOutputStream(file);bw.write(jta.getText();bw.close();catch (FileNotFoundException ex)ex.printStackTrace();catch (IOException ex)ex.printStackTrace();if(e.getSource() = bDel)int

26、 r = table.getSelectedRow();int c = table.getSelectedColumn();File filedel = new File(ld.getText() + .txt);if(filedel.exists()if(filedel.delete()9jta.setText(日志删除成功);elsejta.setText(日志删除失败);elsejta.setText(没有找到日志文件);public void mouseClicked(MouseEvent e)jta.setText(null);int r = table.getSelectedRow

27、();int c = table.getSelectedColumn();if (table.getValueAt(r,c) = null)ld.setText(没有选择日期);elsethis.showTextArea(table.getValueAt(r,c);public void mousePressed(MouseEvent e)public void mouseReleased(MouseEvent e)public void mouseEntered(MouseEvent e)public void mouseExited(MouseEvent e)10private void

28、showTextArea(Object selected)/将所选日期显示出来ld.setText(jtfYear.getText()+年+jtfMonth.getText()+ 月+selected+日);File filein = new File(ld.getText() + .txt);if(filein.exists()tryBufferedReaderbr=newBufferedReader(newInputStreamReader(new FileInputStream(filein);String strRead = br.readLine();jta.setText(null

29、);while(strRead != null)jta.append(strRead);strRead = br.readLine();br.close();catch (FileNotFoundException ex)ex.printStackTrace();catch (IOException ex)ex.printStackTrace();public static void main(String args)JFrame.setDefaultLookAndFeelDecorated(true);JDialog.setDefaultLookAndFeelDecorated(true);

30、new wannianli();void banben_actionPerformed(ActionEvent e) JOptionPane.showMessageDialog(null,内蒙古科技大学实训课程设计n 课题名称: +万年历n 制作人:李少华n 指导教师:赵建峰n 注释:版11权所有,翻版必究! !由于本人水平有限,难免有纰漏,敬请谅解!,说明,JOptionPane.INFORMATION_MESSAGE);class Timer extends Thread/显示系统时间private JLabel lt;privateSimpleDateFormatfy=newSimple

31、DateFormat(G:yyyy.MM.ddat HH:mm:ss:S Z);privateSimpleDateFormatfn=newSimpleDateFormat(G:yyyy.MM.ddat HH:mm:ss:S Z);private boolean b = true;public Timer(JLabel lt)this.lt = lt;public void run()while (true)tryif (b)lt.setText(fy.format(new Date();elselt.setText(fn.format(new Date();b = !b;this.sleep(

32、500);catch (InterruptedException ex)ex.printStackTrace();12classbanben_actionAdapterextendsJFrameimplementsActionListenerwannianli adaptee;banben_actionAdapter(wannianliadaptee)this.adaptee=adaptee;publicvoidactionPerformed(ActionEvente)adaptee.banben_actionPerformed(e);五、结论五、结论对于本程序的设计,首先考虑其功能有哪些,需

33、要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。经过了长时间的反复编写调试,课本和网上查阅相关资料相关文章,终于完成了整个课程设计。在这个过程中,在把书本上的知识给系统的复习了一下的同时,同时也发现了自己的太多不足,对 JAVA 语言整体知识构架不够熟悉,不能灵活地运用所学的知识点。自己的编程方式也不是太标准,经常出现代码写错而调试很久的低级错误情况出现。通过这次课程设计,我明白了编写程序,不仅要求对课本知识有较深刻的了解, 同时要求程序设计者有较强的思维和动手能力。还要熟悉常用的编程技巧和编程思想,不能只

34、关心程序的运行结果,更要注重程序代码的结构,编程者更要有严谨地态度。还有通过设计过程中大量地查阅网络文章,对一些关键知识点逐个地了解并解决相关问题。所以网络这个强大的工具,确实是我们学习之中可以借助的一个很好的帮手。网络是我们学习的最好的老师之一。有问题,问网络,是一个很好的习惯。六、主要参考文献六、主要参考文献1 吴敏,杨国林.C+面向对象程序设计M.呼和浩特:内蒙古大学出版社,2006,2-8.2 王羿.基于医学图像的三维可视化研究D.华中科技大学,2008.3 黄亮.基于皮革胶原显微图像处理与分析的研究与实现D.陕西科技大学,132006.4 侯俊杰.深入浅出 MFCM.北京:人民邮电出

35、版社,2005,13-16.5 张铮.数字图象处理与机器视觉M.北京:人民邮电出版社,2010,36-40.6 孟军,赵晶,王凡. C/C+语言程序设计M.北京:清华大学出版社,2004,25-31.7 霍宏涛.数字图像处理M.北京:北京理工大学出版社,2002,59-66.8 朱晴婷,黄海鹰,陈莲君. Visual C+程序设计M.北京:清华大学出版社,2004,40-44.七、七、源代码源代码package wannianli;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionLi

36、stener;import java.awt.event.MouseEvent;import java.awt.event.MouseListener;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.In

37、putStreamReader;import java.io.OutputStreamWriter;/import java.sql.Date;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.Calendar;importjava.util.Date;import javax.swing.Icon;import javax.swing.JButton;import javax.swing.JDialog;import javax.swing.JFrame;import javax.sw

38、ing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JOptionPane;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.JTextArea;import javax.swing.JTextField;14import javax.swing.table.Default

39、TableModel;publicclass wannianliextends JFrameimplementsActionListener,MouseListenerprivate Calendar cld = Calendar.getInstance();private String astr = 星期一, 星期二, 星期三, 星期四, 星期五, 星期六, 星期日;private DefaultTableModel dtm = new DefaultTableModel(null,astr);private JTable table = new JTable(dtm);/装日期的表格pri

40、vate JScrollPane sp = new JScrollPane(table);private JButton bLastYear = new JButton(上一年);private JButton bNextYear = new JButton(下一年);private JButton bLastMonth = new JButton(上月);private JButton bNextMonth = new JButton(下月);private JTextField jtfYear = new JTextField(5);/jtfYear 年份显示和输入文本框,允许编辑单行文本

41、private JTextField jtfMonth = new JTextField(2);/jtfMonth 月份显示文本框private JPanel p1 = new JPanel();/装入控制日期按钮的模块private JPanel p2 = new JPanel();private JPanel p3 = new JPanel(new BorderLayout();private JPanel p4 = new JPanel(new GridLayout(2,1);private JPanel p5 = new JPanel(new BorderLayout();privat

42、e JButton bAdd = new JButton(保存日志);private JButton bDel = new JButton(删除日志);private JTextArea jta = new JTextArea();/JTextArea是一个显示纯文本的多行区域private JScrollPane jsp = new JScrollPane(jta);/管理视口、可选的垂直和水平滚动条以及可选的行和列标题视口private JLabel l = new JLabel(小提示:可直接输入年份,提高查询效率!);private JLabel lt = new JLabel();/

43、系统时间private JLabel ld = new JLabel();/日期是否被选择private int lastTime;JMenuBar jmb = new JMenuBar();15JMenuview;publicwannianli()super(万年历); /框架命名view = new JMenu(关于);JMenuItem banben = new JMenuItem(版本说明);banben.addActionListener(newbanben_actionAdapter(this);view.add(banben);jmb.add(view);this.setJMen

44、uBar(jmb);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/窗口 关闭函数this.getContentPane().setLayout(new BorderLayout(10,0);jta.setLineWrap(true);/获取文本区的换行策略。 如果设置为 true,则当行的长度大于所分配的宽度时, 将换行。 如果设置为 false, 则始终不换行。table.setGridColor(Color.BLACK);/星期之间的网格线是黑色的table.setColumnSelectionAllowed(true);tabl

45、e.setSelectionBackground(Color.BLACK);/当选定某一天时这一天背景黑色table.setSelectionForeground(Color.YELLOW);/选定的日期字体是黄色的table.setBackground(new Color(200,255,255);/日期显示表格颜色table.setFont(new Font(黑体,Font.BOLD,24);/日期数字字体格式table.setRowHeight(30);/表格的高度table.addMouseListener(this);/鼠标监听器jtfYear.addActionListener(t

46、his);/可输入年份的文本框/为各个按钮添加监听函数bAdd.addActionListener(this);bDel.addActionListener(this);bLastYear.addActionListener(this);bNextYear.addActionListener(this);bLastMonth.addActionListener(this);bNextMonth.addActionListener(this);/将按钮添加到 Jpanel 上p1.add(bLastYear);16p1.add(jtfYear);/年份输入文本框p1.add(bNextYear)

47、;p1.add(bLastMonth);p1.add(jtfMonth);p1.add(bNextMonth);p2.add(bAdd);p2.add(bDel);p3.add(jsp, BorderLayout.CENTER);p3.add(p2, BorderLayout.SOUTH);p3.add(ld, BorderLayout.NORTH);p4.add(l);p4.add(lt);p5.add(p4, BorderLayout.SOUTH);p5.add(sp, BorderLayout.CENTER);p5.add(p1, BorderLayout.NORTH);this.get

48、ContentPane().add(p5, BorderLayout.CENTER);this.getContentPane().add(p3, BorderLayout.EAST);String strDate = DateFormat.getDateInstance().format(newDate().split(-);/获得日期cld.set(Integer.parseInt(strDate0),Integer.parseInt(strDate1)-1, 0);showCalendar(Integer.parseInt(strDate0),Integer.parseInt(strDat

49、e1), cld);jtfMonth.setEditable(false);/设置月份的文本框为不可编辑jtfYear.setText(strDate0);jtfMonth.setText(strDate1);this.showTextArea(strDate2);ld.setFont(new Font(新宋体,Font.BOLD,24);new Timer(lt).start();this.setBounds(200,200,600,320);this.setResizable(false);this.setVisible(true);public void showCalendar(int

50、 localYear, int localMonth, Calendarcld)intDays=getDaysOfMonth(localYear,localMonth)+cld.get(Calendar.DAY_OF_WEEK) - 2;Object ai = new Object7;lastTime = 0;17for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i = Days; i+)aii%7=String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2);/返回一个表示指定的 int 值的 Integer

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 公文通知

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

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com