logo资料库

JAVA实训报告(万年历).doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
成绩: 本科专业实训报告 课题名称:java万年历设计 院系专业:信息工程学院通信工程专业 学号姓名:0967119104 李少华 指导教师:赵建峰 完成日期:2012年6月 28 日星期 四 报告正文 一、简介 (1)选题依据:本次课程设计为自选题。思考一段时间后,我决定做一个万 年历的设计。主要考虑到自己 JAVA 课程基础内容掌握并不是很扎实。而而对于 设计一个万年历程序,由于其功能简单设计也相对较易,并且通过设计这样的一
个日历小组件,也能使自己对 JAVA 的一些基础知识掌握的更加牢固。 (2)课题基本内容:这个项目是一个简单的 Java 万年历,可以实现年份为 四位数的公历日期的查询,并且在相应的日期做备忘录,以及可以显示当前的系 统日期以及时间。 二、主要问题 (1)各个 Jpanel 的布局问题。本程序中有五个 Jpanel。如何使各个容器的 布局合理是首要关心的问题; (2)所选月份天数的算法; (3)所选月份第一天为星期几的算法; (4)输出所选月份该月日历的算法; (5)在选择项中加入 showMessageDialog 的问题。 三、研究方法 (1)各个 Jpanel 的布局问题:针对这个问题,使用 BorderLayout 类。 这是一个布置容器的边框布局,它可以对容器组件进行安排,并调整其大小,使 其符合下列五个区域:北、南、东、西、中。每个区域最多只能包含一个组件, 并通过相应的常量进行标识:NORTH、SOUTH、EAST、WEST、CENTER。当 使用边框布局将一个组件添加到容器中时,要使用这五个常量之一。 (2)所选月份天数的算法:用 if 语句实现。一三五七八十二月份为 31 天, 四六九十一月份为 30 天,对于二月份进行闰年与非闰年的讨论。 (3)所选月份第一天为星期几的算法:使用 get(Calendar.DAY_OF_WEEK) 函数实现。 (4)输出所选月份该月日历的算法:算出所选月份第一天为星期几后,把该 日期以前的位置用空格补上,并从该日起一次输出天数直到月底。从前面的空格 开始算起,把第一天的星期数字减去 1 后即为此天在该序列中的序号,从此天开 始算,利用该序列的序号对 6 取余得 0 换行,即可完整的输出该月的日历。 (5)在选择项中加入 showMessageDialog 的问题:在本程序中,首先定义了 关于“版本说明”的适配器,在这个类中定义了这个选择项的 actionPerformed 方 法。其次,在主程序中为“版本说明”选择项加一个监听器,监听器中调用了刚 1
才定义的适配器。最后,同样在主程序中详细说明 actionPerformed 方法。 四、数据分析 package wannianli; import java.awt.*; import java.awt.event.ActionEvent; import java.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.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; //import java.sql.Date; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JFrame; 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; import javax.swing.JTextArea; import javax.swing.JTextField; import javax.swing.table.DefaultTableModel; public class wannianli extends JFrame implements ActionListener, MouseListener { private Calendar cld = Calendar.getInstance(); 2
private String [] astr = {"星期一", "星期二", "星期三", "星期 四", "星期五", "星期六", "星期日"}; private DefaultTableModel dtm = DefaultTableModel(null,astr); private JTable table = new JTable(dtm); new //装 日期的表格 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 年份 显示和输入文本框,允许编辑单行文本 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()); private JButton bAdd = new JButton("保存日志"); private JButton bDel = new JButton("删除日志"); jta //JTextArea 是一个显示纯文本的多行区域 JTextArea private = new JTextArea(); private JScrollPane jsp = new JScrollPane(jta); //管理视 口、可选的垂直和水平滚动条以及可选的行和列标题视口 private JLabel l = new JLabel("小提示:可直接输入年份,提高查 询效率!"); private JLabel lt = new JLabel();//系统时间 private JLabel ld = new JLabel();//日期是否被选择 private int lastTime; JMenuBar jmb = new JMenuBar(); JMenu view; public { wannianli() 3
super("万年历"); //框架命名 view = new JMenu("关于"); JMenuItem banben = new JMenuItem("版本说明"); banben.addActionListener(new banben_actionAdapter(this)); view.add(banben); jmb.add(view); this.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); 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.addActionListener(this);//可输入年份的文本框 //为各个按钮添加监听函数 bAdd.addActionListener(this); bDel.addActionListener(this); bLastYear.addActionListener(this); bNextYear.addActionListener(this); bLastMonth.addActionListener(this); bNextMonth.addActionListener(this); //将按钮添加到 Jpanel 上 p1.add(bLastYear); p1.add(jtfYear);//年份输入文本框 p1.add(bNextYear); p1.add(bLastMonth); 4
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.getContentPane().add(p5, BorderLayout.CENTER); this.getContentPane().add(p3, BorderLayout.EAST); String [] strDate = DateFormat.getDateInstance().format(new Date()).split("-");//获得日期 cld.set(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1])-1, 0); showCalendar(Integer.parseInt(strDate[0]), Integer.parseInt(strDate[1]), cld); jtfMonth.setEditable(false);//设置月份的文本框为不可编辑 jtfYear.setText(strDate[0]); jtfMonth.setText(strDate[1]); this.showTextArea(strDate[2]); 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 localYear, int localMonth, Calendar cld) { int Days = getDaysOfMonth(localYear, localMonth) + cld.get(Calendar.DAY_OF_WEEK) - 2; Object [] ai = new Object[7]; lastTime = 0; for (int i = cld.get(Calendar.DAY_OF_WEEK)-1; i <= Days; i++) { ai[i%7] = 5
String.valueOf(i-(cld.get(Calendar.DAY_OF_WEEK)-2));//返回一个表示指 定的 int 值的 Integer 实例 if (i%7 == 6) { dtm.addRow(ai); ai = new Object[7]; 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 && year%100 != 0 || year%400 == 0)//闰年 { return 29; return 28; } else { } } public void actionPerformed(ActionEvent e) { if(e.getSource() == jtfYear || e.getSource() == bLastYear || e.getSource() == bNextYear || e.getSource() == bLastMonth || e.getSource() == bNextMonth) { int m, y; try//控制输入的年份正确,异常控制 { 6
if (jtfYear.getText().length() != 4) { throw new NumberFormatException(); } y = Integer.parseInt(jtfYear.getText()); m = Integer.parseInt(jtfMonth.getText()); } catch (NumberFormatException ex) { 0-9 的数字!", "年份有误", JOptionPane.ERROR_MESSAGE); JOptionPane.showMessageDialog(this, " 请 输 入 4 位 return; } ld.setText("没有选择日期"); for (int i = 0; i < lastTime+1; i++){ dtm.removeRow(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)); } else { } jtfMonth.setText(String.valueOf(--m)); } if(e.getSource() == bNextMonth) { if(m == 12) { jtfYear.setText(String.valueOf(++y)); m = 1; jtfMonth.setText(String.valueOf(m)); } else { } jtfMonth.setText(String.valueOf(++m)); 7
分享到:
收藏