




已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
目 录1.设计目标32.设计思想33.类及对象设计34.程序源代码45.调试记录146.总结157.参考文献17JAVA小日历组件设计1设计目标本课程设计是一个JAVA小日历组件的设计,利用Frame框架类、面板类进行图形化界面设计,实现小日历的公历显示等功能。2设计思想(1)本小日历设计主体结构为:设计一个框架MainFrame,然后在MainFrame里添加一个MainPanel面板。定义一个MainPanel面板类,该面板以边布局格式,所有其他面板、标签等均添加到该面板中。(2)MainPanel面板北部(上方),添加一个年月面板YearMonthPanel。该年月面板主要放年份显示、月份显示、标题显示。YearMonthPanel面板也使用边布局格式,西部添加一个年份面板,放年份信息;中部添加一个TextPanel面板,放标题文本显示信息;东部添加一个月份面板MonthPanel,放月份下拉框信息。(3)MainPanel主面板的中部,添加一个DaysPanel面板用于放置月份的天数表格信息。(4)MainPanel主面板的南部(下方),添加一个InfoPanel面板,主要用于放置显示个人信息。(5)InfoPanel面板上设计添加一个超级链接标签,链接到个人博客。3设计类及对象设计在本程序中:定义了一个Frame类,主要定义一个窗体框架,用于显示日历信息,并在主函数中只创建一个该窗体对象实现程序功能。定义了一个主日历面板类Xiaorili,其中包含了日历设计所用到的全局变量、功能函数等,在Frame类里定义了其对象。在该日历面板类里又设计了一个内部类CalendarTable表格类,用于布局日历天的显示格式。为了设计一个超级链接,定义了一个LinkLable类,单独保存在一个文件LinkTbale.java中,在日历面板类Xiaorili里定义了其对象。4程序源代码(1)xiaoril.java文件代码:import java.awt.*;import java.awt.event.*;import java.util.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.table.*;public class Xiaorili extends JApplet /= /*定义全局变量*/ public static final Color background = Color.white;/背景色 public static final Color foreground = Color.black;/前景色 public static final Color headerBackground = Color.DARK_GRAY;/星期 public static final Color headerForeground = Color.white;/星期前景色 public static final Color selectedBackground = Color.green;/选中背景色 public static final Color selectedForeground = Color.white;/选中前景色 public static final String WeekSun = 星期日; /星期标签名称 public static final String WeekMon = 星期一; public static final String WeekTue = 星期二; public static final String WeekWed = 星期三; public static final String WeekThu = 星期四; public static final String WeekFri = 星期五; public static final String WeekSat = 星期六; private JPanel MainPanel;/日历面板 private JLabel yearsLabel;/“年份”标签 private JSpinner yearsSpinner;/年份组合框 private JLabel monthsLabel;/“月份”标签 private JComboBox monthsComboBox; /12月份下拉框 private JLabel textLabel;/标题显示标签 private JLabel InfoLabel;/个人信息显示标签 private JTable daysTable; /日表格 private AbstractTableModel daysModel;/天单元表格 private Calendar calendar;/日历对象/=/*函数定义*/ public Xiaorili() /构造函数 MainPanel = (JPanel) getContentPane(); public void init() /初始化面板界面函数 MainPanel.setLayout(new BorderLayout(); calendar = Calendar.getInstance();/默认方式,以本地的时区和地区来构造Calendar/- yearsLabel = new JLabel(年份: ); /设置年份标签显示 yearsSpinner = new JSpinner();/构造年份spinner组合框 yearsSpinner.setEditor(new JSpinner.NumberEditor(yearsSpinner, 0000); yearsSpinner.setValue(new Integer(calendar.get(Calendar.YEAR); yearsSpinner.addChangeListener(new ChangeListener() /注册该组合框的事件监听器 public void stateChanged(ChangeEvent changeEvent) int day = calendar.get(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, 1); calendar.set(Calendar.YEAR, (Integer) yearsSpinner.getValue().intValue(); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); calendar.set(Calendar.DAY_OF_MONTH, day maxDay ? maxDay : day); updateView();/更新显示 );/- JPanel yearMonthPanel = new JPanel();/定义年月面板 MainPanel.add(yearMonthPanel, BorderLayout.NORTH);/添加年月面板到日历面板的南面(最上方) yearMonthPanel.setLayout(new BorderLayout();/边布局模式 JPanel yearPanel = new JPanel();/构建年份面板 yearMonthPanel.add(yearPanel, BorderLayout.WEST);/年份面板添加到年月面板西部(左边) yearPanel.setLayout(new BorderLayout();/设置年份面板为边布局并添加年份标签和组合框 yearPanel.add(yearsLabel, BorderLayout.WEST); yearPanel.add(yearsSpinner, BorderLayout.CENTER);/- monthsLabel = new JLabel(月份: ); /设置月份标签显示 monthsComboBox = new JComboBox();/月份下拉框 for (int i = 1; i maxDay ? maxDay : day); updateView();/更新面板显示 ); /- JPanel monthPanel = new JPanel();/定义月份面板 yearMonthPanel.add(monthPanel, BorderLayout.EAST);/添加月份面板到年月面板的东面(右面) monthPanel.setLayout(new BorderLayout();/月份面板设为边布局方式 monthPanel.add(monthsLabel, BorderLayout.WEST);/添加月份名称标签到月份面板西面(左面) monthPanel.add(monthsComboBox, BorderLayout.CENTER);/添加月份下拉框到月份面板中间/- textLabel = new JLabel(JAVA小日历-061114052); /设置标题标签显示 JPanel txetPanel = new JPanel();/定义标题文本显示面板 yearMonthPanel.add(txetPanel,BorderLayout.CENTER);/添加标题文本显示面板到年月面板中间 txetPanel.add(textLabel,BorderLayout.CENTER);/添加标题文本标签到面板/- InfoLabel = new JLabel(学号:24072400287 姓名:谢水全 班级:07计算机班); /设置个人信息标签显示 JPanel InfoPanel = new JPanel();/定义底部个人信息显示面板 MainPanel.add(InfoPanel,BorderLayout.SOUTH);/添加个人信息显示面板到日历面板南方(下方) InfoPanel.add(InfoLabel);/添加信息标签文本标签到面板/- JPanel Link = new JPanel();/设置超级链接到我的博客 InfoPanel.add(new LinkLabel(访问谢水全工作室, );/- daysModel = new AbstractTableModel() /设置7行7列 public int getRowCount() return 7; public int getColumnCount() return 7; public Object getValueAt(int row, int column) if (row = 0) /第一行显示星期 return getHeader(column); row-; Calendar calendar = (Calendar) Xiaorili.this.calendar.clone(); calendar.set(Calendar.DAY_OF_MONTH, 1); int dayCount = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); int moreDayCount = calendar.get(Calendar.DAY_OF_WEEK) - 1; int index = row * 7 + column; int dayIndex = index - moreDayCount + 1; if (index dayCount) return null; else return new Integer(dayIndex); ; daysTable = new CalendarTable(daysModel, calendar); /构造日表格 daysTable.setCellSelectionEnabled(true);/设置表格单元格可选择 daysTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); daysTable.setDefaultRenderer(daysTable.getColumnClass(0), new TableCellRenderer() public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) String text = (value = null) ? : value.toString(); JLabel cell = new JLabel(text); cell.setOpaque(true); /绘制边界内的所有像素 if (row = 0) /第一行显示星期,设置为星期的前景色和背景色 cell.setForeground(headerForeground); cell.setBackground(headerBackground); else if (isSelected) /日期单元格如果选中,则设置为日期选中的前、背景色 cell.setForeground(selectedForeground); cell.setBackground(selectedBackground); else /设置日期单元格的普通前、背景色 cell.setForeground(foreground); cell.setBackground(background); return cell; ); updateView(); MainPanel.add(daysTable, BorderLayout.CENTER);/添加日面板到日历面板中间 /- public static String getHeader(int index) /设置第一行星期的显示 switch (index) case 0: return WeekSun; case 1: return WeekMon; case 2: return WeekTue; case 3: return WeekWed; case 4: return WeekThu; case 5: return WeekFri; case 6: return WeekSat; default: return null; /- public void updateView() /更新面板显示方法 daysModel.fireTableDataChanged();daysTable.setRowSelectionInterval(calendar.get(Calendar.WEEK_OF_MONTH), calendar.get(Calendar.WEEK_OF_MONTH);daysTable.setColumnSelectionInterval(calendar.get(Calendar.DAY_OF_WEEK) - 1,calendar.get(Calendar.DAY_OF_WEEK) - 1); /= public static class CalendarTable extends JTable /表格类 private Calendar calendar; public CalendarTable(TableModel model, Calendar calendar) /构造方法 super(model); this.calendar = calendar; /- public void changeSelection(int row, int column, boolean toggle, boolean extend) /选择表格单元格时 super.changeSelection(row, column, toggle, extend); if (row = 0) /选择为第一行(星期)时不改变单元格 return; Object obj = getValueAt(row, column); if (obj != null) calendar.set(Calendar.DAY_OF_MONTH, (Integer)obj).intValue(); (2)LinkLabel.java文件代码:import java.awt.*;import javax.swing.*;import java.awt.event.*;public class LinkLabel extends JLabel private String text, url;private boolean isSupported;public LinkLabel(String text, String url) this.text = text;/显示文本 this.url = url;/链接地址 try this.isSupported = Desktop.isDesktopSupported() & Desktop.getDesktop().isSupported(Desktop.Action.BROWSE); catch (Exception e) /捕获浏览器异常 this.isSupported = false; setText(false); addMouseListener(new MouseAdapter() /注册鼠标单击事件监听器 public void mouseEntered(MouseEvent e) setText(isSupported); if (isSupported) setCursor(new Cursor(Cursor.HAND_CURSOR);/鼠标形状为hand形式 public void mouseExited(MouseEvent e) /移开鼠标时 setText(false); public void mouseClicked(MouseEvent e) /鼠标单击时 try Desktop.getDesktop().browse(new .URI(LinkLabel.this.url);/调用默认浏览器打开链接 catch (Exception ex) );private void setText(boolean b) /设置标签显示文本if (!b)setText( + text);/鼠标移到标签外显示为红色字体 else setText( + text);/鼠标移到标签上面显示为绿色字体 (3)MainFrame.java文件代码:/* * (#) MainFrame.java * 主窗体 * author 谢水全工作室: */import java.awt.*;import javax.swing.*;/构造窗体类public class MainFrame extends JFramepublic MainFrame()super(JAVA小日历-谢水全工作室-);/创建窗体并设置标题 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/单击窗口关闭按钮关闭窗体 Xiaorili Xiaorili = new Xiaorili();/创建小日历对象 Xiaorili.init();/初始化面板 this.getContentPane().add(Xiaorili); this.setSize(450, 200); /框架大小 this.setVisible(true);/设置可见性 this.setResizable(false);/窗体不可改变大小 this.pack(); /*主函数调用*/ public static void main(String args) new MainFrame(); 5.调试记录程序功能调试如下:(1) 运行程序,出现日历界面:(6总结(1)选题目的:本次课程设计为课本后设计题目任选一题进行设计。思考一段时间后,我决定做一个小日历组件的设计。主要考虑到本学期时间少课程内容多,JAVA课程基础内容掌握并不是很抓实,而对于设计一个小日历组件,由于其功能简单设计也相对较易,对于我个人的学习情况比较合适,并且通过设计这样的一个日历小组件,也能使自己对JAVA的一些基础知识掌握的更加牢固。(2)对于本小日历的设计,首先考虑其功能有哪些,需要显示什么,如何进行窗体构建布局,需要用哪些知识点,如相关的类和对象等。最后,就是根据初步设计的功能和布局构架,考虑用源代码进行实现了。(3)本小日历组件在设计过程中参考了一些网络上的日历组件设计程序,只是那些程序大都使用功能相对较丰富,涉及到的知识也比较多,对于自己目前所掌握的内容来说有点广博。不过那些程序对日历实现的一些思想对我确实有很多启发。本小日历组件设计过程中也参考了一些他人设计的代码。在设计本小日历组件过程中遇到过许多问题,最后都是在网络搜集询问的帮助下一一得以解决。下面列举几个参考中比较重要的相关内容:u .JAVA Calendar方法:Calendar 抽象类定义了足够的方法,让我们能够表述日历的规则。我们也可以自己的 Calendar 实现类,然后将它作为 Calendar 对象返回(面向对象的特性)。在 Calendar 的方法中,get() 和 add() 会让 Calendar 立刻刷新。本程序的中心设计即是利用Calendar类来实现。u javax.swing.JSpinner用法:让用户从一个有序序列中选择一个数字或者一个对象值的单行输入字段。它能够方便地选择日期、数字或列表中的选项。Spinner 通常提供一对带小箭头的按钮以便逐步遍历序列元素。键盘的向上/向下方向键也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 辽宁中医面试题库及答案
- 粮管所保安面试题库及答案
- 乐清城投面试题库及答案
- 快运客服面试题库及答案
- 考护士长面试题目及答案
- 康缘集团面试题库及答案
- 安全教育培训课件细化
- 垃圾焚烧发电行业2025年技术创新与新能源补贴政策协同发展模式创新报告
- 公司周年庆典致辞模式
- 农业科技创新项目计划
- YS/T 931-2013硝酸钯
- GB/T 20863.1-2021起重机分级第1部分:总则
- 工程勘察设计收费标准(2002年修订本)
- 高中通用技术会考试题及详解
- 肝性脑病(课件)
- 【名校】《三思而后行》 完整版课件
- 公司内部程序文件(格式模版)
- 泛光施工招标文件
- 旅游策划实务整套课件完整版电子教案课件汇总(最新)
- DB23∕T 2661-2020 地热能供暖系统技术规程
- 人工挖孔桩施工监测监控措施
评论
0/150
提交评论