日历小程序解读

合集下载

微信小程序日历日期选择插件使用方法详解

微信小程序日历日期选择插件使用方法详解

微信⼩程序⽇历⽇期选择插件使⽤⽅法详解微信⼩程序⽇历选择器插件点击⽇历⽇期可以获取到年⽉⽇,具体内容如下wxml<view class="canlendarBgView"><view class="canlendarView"><view class="canlendarTopView"><view class="leftBgView" bindtap="handleCalendar" data-handle="prev"><view class="leftView">《</view></view><view class="centerView">{{cur_year || "--"}} 年 {{cur_month || "--"}} ⽉</view><view class="rightBgView" bindtap="handleCalendar" data-handle="next"><view class="rightView">》</view></view></view><view class="weekBgView"><view class="weekView" wx:for="{{weeks_ch}}" wx:key="{{index}}" data-idx="{{index}}">{{item}}</view></view><view class="dateBgView"><view wx:if="{{hasEmptyGrid}}" class="dateEmptyView" wx:for="{{empytGrids}}" wx:key="{{index}}" data-idx="{{index}}"></view><view class="dateView" wx:for="{{days}}" wx:key="{{index}}" data-idx="{{index}}" bindtap="dateSelectAction"><view class="datesView {{index == todayIndex ? 'dateSelectView' : ''}}">{{item}}</view></view></view></view><view>点击⽇期选择</view></view>js//index.js//获取应⽤实例Page({data: {hasEmptyGrid: false,cur_year: '',cur_month: '',},onLoad(options) {this.setNowDate();},dateSelectAction: function (e) {var cur_day = e.currentTarget.dataset.idx;this.setData({todayIndex: cur_day})console.log(`点击的⽇期:${this.data.cur_year}年${this.data.cur_month}⽉${cur_day + 1}⽇`);},setNowDate: function () {const date = new Date();const cur_year = date.getFullYear();const cur_month = date.getMonth() + 1;const todayIndex = date.getDate() - 1;console.log(`⽇期:${todayIndex}`)const weeks_ch = ['⽇', '⼀', '⼆', '三', '四', '五', '六'];this.calculateEmptyGrids(cur_year, cur_month);this.calculateDays(cur_year, cur_month);this.setData({cur_year: cur_year,cur_month: cur_month,weeks_ch,todayIndex,})},getThisMonthDays(year, month) {return new Date(year, month, 0).getDate();},getFirstDayOfWeek(year, month) {return new Date(Date.UTC(year, month - 1, 1)).getDay();},calculateEmptyGrids(year, month) {const firstDayOfWeek = this.getFirstDayOfWeek(year, month);let empytGrids = [];if (firstDayOfWeek > 0) {for (let i = 0; i < firstDayOfWeek; i++) {empytGrids.push(i);}this.setData({hasEmptyGrid: true,empytGrids});} else {this.setData({hasEmptyGrid: false,empytGrids: []});}},calculateDays(year, month) {let days = [];const thisMonthDays = this.getThisMonthDays(year, month);for (let i = 1; i <= thisMonthDays; i++) {days.push(i);}this.setData({days});},handleCalendar(e) {const handle = e.currentTarget.dataset.handle;const cur_year = this.data.cur_year;const cur_month = this.data.cur_month;if (handle === 'prev') {let newMonth = cur_month - 1;let newYear = cur_year;if (newMonth < 1) {newYear = cur_year - 1;newMonth = 12;}this.calculateDays(newYear, newMonth);this.calculateEmptyGrids(newYear, newMonth);this.setData({cur_year: newYear,cur_month: newMonth})} else {let newMonth = cur_month + 1;let newYear = cur_year;if (newMonth > 12) {newYear = cur_year + 1;newMonth = 1;}this.calculateDays(newYear, newMonth);this.calculateEmptyGrids(newYear, newMonth);this.setData({cur_year: newYear,cur_month: newMonth})}}})以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

万年历应用小程序设计报告

万年历应用小程序设计报告

题目:万年历应用小程序一、题目陈述:设计一个万年历,要求具有显示年份、月份、日期的功能,与windowsXP 系统的日期与时间的界面和功能类似。

二、问题分析:万年历的界面可由内容面板类panel 和spinner 、textArea 、comboBox 等容器构成;布局可以由BorderLayout 、FlowLayout 、GridLayout 使其达到美观整齐的效果。

万年历功能的实现是通过添加相应的监听器和事件处理函数来完成的。

三、题目设计:(一)、类设计:1、 面板类CalendarDemo :嵌入显示月份的comboBox 和显示年份的spinner ,以及显示日期的textArea 。

2、 窗口类CalendarTest :镶入面板,设计窗口大小等属性,并包含主函数。

运行后显示该窗口。

3、 类与类之间的关系:(二)、界面设计:根据windows 的日期界面,利用JPanel 提供的BorderLayout 、FlowLayout ,将包含comboBox 和spinner 的panel1放在NORTH 区,包含textArea 的panel2放在CENTER 区。

CalendarDemo 类的对象panel 的titledBorder 设置为“日期”(三)、事件处理:匿名内部类事件监听器做事件处理:用comboBox实现月份变换改变日期变换的PopupMenuListener()、用spinner实现年份变换改变日期变换的ChangeListener()。

具体处理方式:(四)、主要的成员变量和成员函数:1、面板类CalculatorDemo:JComboBox comboBox;JSpinner spinner;JTextArea textArea;JPanel panel1,panel2;String[] monthsString[] date;int thisYear, thisMonth;Public void typeset() ;2、窗口类CalculatorTest:CalendarDemo panel;public static void main;四、源代码:import javax.swing.*;import java.awt.*;import javax.swing.event.*;public class CalendarDemo extends JPanel{JComboBox comboBox;JSpinner spinner;JTextArea textArea;JPanel panel1,panel2;String[] months = { "一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月","十月", "十一月", "十二月" };String[] date = { "日", "一", "二", "三", "四", "五", "六" };int thisYear , thisMonth;public CalendarDemo(){super(new BorderLayout());setBorder(BorderFactory.createTitledBorder("日期"));comboBox = new JComboBox(months);spinner = new JSpinner(new SpinnerNumberModel(2006, 1980, 2099, 1));textArea = new JTextArea();panel1=new JPanel(new FlowLayout());panel2=new JPanel(new FlowLayout());panel1.add(comboBox);panel1.add(spinner);panel2.add(textArea);add(panel1,BorderLayout.NORTH);add(panel2,BorderLayout.CENTER);comboBox.setSelectedItem( "十二月");thisMonth =comboBox.getSelectedIndex()+1;comboBox.addPopupMenuListener(new PopupMenuListener() {public void popupMenuCanceled(PopupMenuEvent e) {}public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {thisMonth = comboBox.getSelectedIndex() + 1;typeset();}public void popupMenuWillBecomeVisible(PopupMenuEvent e) {}});spinner.setValue( 2006);spinner.addChangeListener(new ChangeListener() {public void stateChanged(ChangeEvent e) {thisYear = Integer.parseInt(spinner.getValue().toString());typeset();}});textArea.setBorder(BorderFactory.createLoweredBevelBorder());textArea.setEditable(false);textArea.setTabSize(3);typeset();}public void typeset(){textArea.setText( "");int jan,march,may,july,augest,oct,dec;int feb=28;int april,june,sept,nov;int day,days,tempdays;int i,j,num=1;jan=march=may=july=augest=oct=dec=31;april=june=sept=nov=30;i=j=0;day=days=tempdays=0;thisYear = 2006;if(thisYear%4==0){if(thisYear%100==0){ if(thisYear%400==0) feb=29;else feb=28;}else feb=29;}else feb=28;tempdays=(thisYear-1980)/4*(365*3+366)+((thisYear-1980)%4)*365+29-feb;switch (thisMonth){case 1:days=jan;day=tempdays%7;break;case 2:days=feb;day=(jan+tempdays)%7;break;case 3:days=march;day=(jan+feb+tempdays)%7 ;break;case 4:days=april;day=(jan+feb+march+tempdays)%7 ;break;case 5:days=may;day=(jan+feb+march+april+tempdays)%7 ;break;case 6:days=june;day=(jan+feb+march+april+may+tempdays)%7 ;break;case 7:days=july;day=(jan+feb+march+april+may+june+tempdays)%7 ;break;case 8:days=augest;day=(jan+feb+march+april+may+june+july+tempdays)%7 ;break;case9:days=sept;day=(jan+feb+march+april+may+june+july+augest+tempdays)%7 ;break;case10:days=oct;day=(jan+feb+march+april+may+june+july+augest+sept+tempdays)%7;break;case11:days=nov;day=(jan+feb+march+april+may+june+july+augest+sept+oct+tempdays)%7 ;break;case12:days=dec;day=(jan+feb+march+april+may+june+july+augest+sept+oct+nov+tempdays)%7 ;br eak;}for(i=0;i<7;i++)textArea.append("\t"+date[i]);textArea.append( "\n");if(day<5){ textArea.append( "\t \t ");for(i=0,j=3;i<day;i++,j++)textArea.append("\t ");}else if(day==6){textArea.append("\t ");j=2;}else j=1;for(num=1;num<=days;num++,j++){if(num<10) textArea.append(" \t" + num);else textArea.append("\t" + num);if((j!=0)&&((j%7)==0)) textArea.append("\n");}textArea.append("");}}import java.awt.*;import javax.swing.*;public class CalendarTest extends JFrame{CalendarDemo panel;public CalendarTest(){super("Karen's Calendar");Container contentPane = getContentPane();panel = new CalendarDemo();contentPane.add(panel);setBounds(300, 200, 295, 240);setResizable(false);setVisible(true);}public static void main(String[] args){CalendarTest calFr = new CalendarTest();calFr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}五、收获体会:1、写监听器类的时候要覆盖它的全部父类函数,因为它是抽象类2、学会了使用java自带的库函数3、类与类之间数据通过类对象的传递4、尝试了创建事件监听器的4种方法。

微信小程序实现日历功能

微信小程序实现日历功能

微信⼩程序实现⽇历功能本⽂实例为⼤家分享了微信⼩程序实现⽇历功能的具体代码,供⼤家参考,具体内容如下效果图:代码:<view class="calendar"><view class="selectDate"><view class="goleft iconfont icon-jianzuo" bindtap="prevMonth"></view><view class="date-wrap">{{year}}年{{month}}⽉</view><view class="goright iconfont icon-jianzuo" bindtap="nextMonth"></view></view><view class="week"><view wx:for="{{weekArr}}" wx:for-index="index" wx:for-item="item" wx:key="key" style="width:{{param}}px;height:{{param-17}}px;line-height:{{param-17}}px">{{item}}</view></view><view class="date" style='width: {{ param * 7 }}px;'><block wx:for="{{dateArr}}" wx:for-index="index" wx:for-item="item" wx:key="key"><view style="{{index ==0?'margin-left:'+ param *firstDay +'px;':''}}width:{{param}}px;height:{{param-10}}px;line-height:{{param-10}}px;" class="{{index+1==day?'today':''}} {{index+1==day&&isClock?'clockOn':''}}"><view class="day">{{item}}</view></view> </block></view></view><!--end calendar-->data: {year:'',month:'',day:'',weekArr: ['⽇', '⼀', '⼆', '三', '四', '五','六'],dateArr:[],firstDay:'',lastDay:'',param:null,clockNum:3,},getDate: function () { //获取当⽉⽇期var mydate = new Date();var year = mydate.getFullYear();var month = mydate.getMonth();var months = month + 1;this.data.year = year;this.data.month = months;this.data.day = mydate.getDate();var fist = new Date(year, month, 1);this.data.firstDay = fist.getDay();var last = new Date(year, months, 0);stDay = last.getDate();this.setData({year: this.data.year,month: this.data.month,day: this.data.day,firstDay: this.data.firstDay,lastDay: stDay})console.log("今天:" + this.data.day);},setDate: function () {for (var i = 1; i < stDay + 1; i++) {this.data.dateArr.push(i);}this.setData({dateArr: this.data.dateArr,firstDay: this.data.firstDay})},prevMonth:function(){ //上⼀⽉var months="";var years="";if(this.data.month ==1){years=this.data.year-1this.data.month=12;months=this.data.month;}else{years=this.data.year;months = this.data.month - 1;}var first = new Date(years, months-1, 1);this.data.firstDay = first.getDay();var last = new Date(years, months, 0);stDay = last.getDate();this.setData({month: months,year:years,firstDay: this.data.firstDay,lastDay: stDay})this.data.dateArr = [];for (var i = 1; i < stDay + 1; i++) {this.data.dateArr.push(i);}this.setData({dateArr: this.data.dateArr})},nextMonth:function(){ //下⼀⽉var months="";var years="";if(this.data.month== 12){this.data.month=0;months = this.data.month;years = this.data.year+1;}else{months = this.data.month+1;years = this.data.year;}var months = this.data.month + 1;var first = new Date(years, months-1,1);this.data.firstDay= first.getDay();var last = new Date(years,months,0);stDay= last.getDate();this.setData({month: months,year:years,firstDay:this.data.firstDay,lastDay:stDay})this.data.dateArr = [];for (var i = 1; i < stDay + 1; i++) {this.data.dateArr.push(i);}this.setData({dateArr: this.data.dateArr})},onLoad: function (options) {this.getDate();this.setDate();var res = wx.getSystemInfoSync();this.setData({param:res.windowHeight/12,})},以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

java日历小程序

java日历小程序

java日历小程序简介:Java日历小程序是一个基于Java语言开发的工具,用于显示和管理日期和时间。

它提供了一种简单而直观的方式来查看、创建和编辑日历事件,并提供了一些额外的功能,如提醒、重复事件和时间段的计算等。

本文将详细介绍Java日历小程序的功能、使用方法和设计原理。

功能:1. 显示日历:Java日历小程序可以显示当前月份的日历,并以日、周或月的形式展示。

用户可以通过界面上的上下翻页按钮切换月份,方便查看不同日期的日历。

2. 创建和编辑事件:用户可以通过Java日历小程序创建新的日历事件,并为每个事件指定标题、日期、时间和地点等详细信息。

程序还提供了事件编辑功能,允许用户修改已有事件的信息。

3. 提醒功能:Java日历小程序可以设置事件的提醒功能,提醒用户在指定的时间前提醒。

用户可以选择在事件开始前几分钟、几小时或几天提醒,并可以自定义提醒方式,如弹窗、声音或邮件通知等。

4. 重复事件:用户可以为事件设置重复功能,使事件在指定的日期间隔内重复发生。

可以选择每天、每周、每月或每年重复,并可以设置重复的结束日期。

5. 时间段计算:Java日历小程序可以计算两个日期之间的时间段,如计算两个事件之间的天数、小时数或分钟数等。

用户可以选择计算方式,并获取精确的时间段结果。

使用方法:1. 下载和安装:用户可以从官方网站上下载Java日历小程序的安装包,然后按照安装向导进行安装。

安装完成后,用户可以在桌面或开始菜单中找到程序的快捷方式。

2. 打开程序:双击程序的快捷方式,Java日历小程序将启动并显示当前月份的日历。

用户可以通过界面上的按钮和菜单来使用各种功能。

3. 创建事件:用户可以点击界面上的“添加事件”按钮,弹出一个对话框,输入事件的详细信息,如标题、日期、时间和地点等。

点击“确定”按钮后,事件将被创建并显示在日历上。

4. 编辑事件:用户可以在日历上点击已有的事件,弹出一个对话框,允许用户修改事件的信息。

万年历程序设计说明书

万年历程序设计说明书

万年历程序设计说明书一、引言万年历是一款方便用户查询日期、农历、节假日等信息的应用程序。

本文档将详细介绍万年历程序的设计和功能实现,以帮助开发人员理解和使用该程序。

二、需求分析1. 用户可以通过程序查询指定日期的公历和农历信息。

2. 用户可以查看指定日期是否为节假日,并显示节假日名称。

3. 用户可以选择查询某个年份的所有节假日。

4. 用户可以设置提醒功能,当指定日期到来时,程序会发送通知提醒用户。

5. 界面友好,操作简单,用户体验良好。

三、系统设计1. 技术选型本程序将使用Python语言进行开发,使用以下库和框架:- tkinter:用于创建程序的图形用户界面。

- datetime:用于处理日期和时间相关的操作。

- requests:用于发送HTTP请求,获取节假日数据。

- plyer:用于发送系统通知。

2. 模块划分本程序将分为以下几个模块:- 主界面模块:负责显示程序的主界面,包括日期选择框、查询按钮等。

- 日期查询模块:负责处理用户输入的日期,查询公历和农历信息,并显示在界面上。

- 节假日查询模块:负责查询指定日期是否为节假日,并显示节假日名称。

- 节假日提醒模块:负责设置提醒功能,当指定日期到来时发送系统通知提醒用户。

3. 数据获取与处理- 公历和农历信息:使用datetime库获取指定日期的公历和农历信息。

- 节假日数据:通过发送HTTP请求获取节假日数据,并使用json库进行解析和处理。

四、功能实现1. 主界面设计主界面应包括日期选择框、查询按钮、显示区域等组件,用户可以通过日期选择框选择查询日期,并点击查询按钮进行查询操作。

查询结果将显示在显示区域中。

2. 日期查询功能实现用户选择查询日期后,程序将使用datetime库获取公历和农历信息,并将其显示在界面上。

3. 节假日查询功能实现用户可以选择查询某个年份的所有节假日。

程序将通过发送HTTP请求获取节假日数据,并使用json库进行解析和处理。

简易日历小程序使用微信小程序开发工具和JavaScript开发

简易日历小程序使用微信小程序开发工具和JavaScript开发

简易日历小程序使用微信小程序开发工具和JavaScript开发在微信小程序开发工具和JavaScript开发一款简易日历小程序,可以帮助用户管理自己的日程安排。

本文将介绍开发该小程序的步骤和相关代码。

1. 环境准备在开始开发前,需要下载并安装微信小程序开发工具,并确保具备一定的JavaScript编程基础。

2. 项目搭建打开微信小程序开发工具,点击新建项目,填写项目名称、项目目录等信息,并选择合适的框架。

3. 目录结构在项目创建完成后,可以看到默认生成的目录结构,包括app.js、app.json、app.wxss等文件。

我们需要在其中添加日历相关的代码文件。

4. 页面设计在开发工具中,可以新建一个页面用于展示日历。

点击左侧导航栏的新建页面按钮,填写页面名称,系统会自动生成相关的文件。

5. 页面代码打开新建页面的js文件,在其中编写相关的JavaScript代码。

可以使用wx.request()函数请求后端接口获取日历信息,并将数据渲染到页面中。

6. 页面样式打开新建页面的wxss文件,在其中编写相关的CSS样式代码,可以对日历的外观进行样式设计,如背景颜色、字体大小等。

7. 页面交互在页面中,可以通过监听用户的点击事件,实现日历的交互功能。

例如,用户点击某一天的日期,可以跳转到该日期对应的日程安排页面。

8. 发布小程序开发完成后,在开发工具中点击预览按钮,可以进行预览功能测试。

测试通过后,可以点击发布按钮,将小程序发布到微信平台。

9. 小程序优化为了提升小程序的性能和用户体验,可以对代码进行优化。

例如,使用缓存技术减少数据加载时间,使用小程序框架提供的组件减少代码量等。

通过以上步骤,我们可以使用微信小程序开发工具和JavaScript开发一款简易日历小程序。

该小程序可以帮助用户管理自己的日程安排,实现基本的日历功能和交互效果。

同时,开发者可以根据需求进行进一步的优化和扩展,以提升小程序的功能和用户体验。

java日历小程序课程设计

java日历小程序课程设计

java日历小程序课程设计【标题】Java日历小程序课程设计【摘要】本文将详细介绍一种基于Java编程语言的日历小程序的设计和实现。

通过该小程序,用户可以方便地查看日期、周数和节假日,并进行简单的日程安排。

本文将分为以下几个部分进行介绍:需求分析、系统设计、界面设计、功能实现和测试。

通过阅读本文,读者将了解到如何使用Java编写一个简单实用的日历小程序。

【关键词】Java编程语言、日历小程序、需求分析、系统设计、界面设计、功能实现、测试【正文】一、需求分析日历小程序的主要功能是显示当前日期、周数和节假日,并提供简单的日程安排功能。

用户可以通过界面直观地查看日历信息,并添加、编辑和删除日程。

具体需求如下:1. 显示当前日期:程序启动时,显示当前日期,包括年、月、日。

2. 显示当前周数:程序启动时,显示当前所在周数。

3. 显示节假日信息:根据国家或地区的节假日规定,显示当天是否为节假日。

4. 查看日历:用户可以通过界面查看指定年份和月份的日历信息。

5. 添加日程:用户可以添加新的日程安排,包括日期、时间和内容。

6. 编辑日程:用户可以编辑已有的日程安排,修改日期、时间和内容。

7. 删除日程:用户可以删除已有的日程安排。

二、系统设计1. 技术选型:本系统采用Java编程语言进行开发。

使用Java的面向对象特性,实现日历小程序的各项功能。

2. 架构设计:采用MVC(Model-View-Controller)架构模式,将数据、界面和逻辑分离,提高代码的可维护性和可扩展性。

3. 数据存储:使用SQLite数据库存储日程信息,包括日期、时间和内容。

4. 外部接口:通过调用第三方API获取节假日信息,并根据返回的数据判断当天是否为节假日。

三、界面设计1. 主界面:显示当前日期、周数和节假日信息。

提供查看日历、添加日程、编辑日程和删除日程的入口。

2. 日历界面:根据用户选择的年份和月份,显示对应的日历信息。

用户可以通过左右滑动切换月份。

互联网小工具推荐在线日历应用

互联网小工具推荐在线日历应用

互联网小工具推荐在线日历应用互联网小工具推荐:在线日历应用随着互联网的高速发展,越来越多的互联网小工具涌现出来,给我们的生活带来了很多便利。

其中,在线日历应用就是一种非常实用的小工具。

在繁忙的现代生活中,我们经常面临时间管理和安排任务的挑战,而在线日历应用可以帮助我们更加高效地进行时间管理和日程安排。

本文将为大家推荐几款优秀的在线日历应用,并介绍它们的特点和优势。

一、Google Calendar众所周知,Google Calendar是一款功能强大的在线日历应用,作为Google旗下的产品之一,它拥有丰富的功能和用户友好的界面设计。

1. 丰富的功能:Google Calendar支持创建日程、设定提醒、设置日程重复性、共享日程等功能。

它还可以与Gmail、Google Keep等其他应用进行集成,帮助用户更加高效地管理日程和任务。

2. 用户友好的界面设计:Google Calendar的界面简洁清晰,操作简单直观,用户可以轻松地添加、编辑、删除日程,并进行快速查看。

二、Outlook CalendarOutlook Calendar是Windows操作系统和Outlook邮件客户端的日历应用,它也是一款非常流行的在线日历工具。

1. 与Outlook邮箱无缝集成:Outlook Calendar与Outlook邮箱完美结合,能够自动同步邮件和日程,方便用户进行时间安排和邮件管理。

2. 共享日程和预约功能:Outlook Calendar支持与他人共享日程、预约会议等功能,适用于团队协作或多人会议安排。

三、Apple Calendar作为苹果公司的日历应用,Apple Calendar在iOS和macOS系统上广受欢迎,它具有以下特点:1. 精美的界面设计:Apple Calendar采用了苹果一贯的简约设计风格,界面美观大方,操作流畅顺手。

2. 与iCloud云服务同步:Apple Calendar可以与iCloud云服务进行同步,这意味着用户可以在不同的Apple设备上随时随地访问和管理日程。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录一、摘要 (1)二、程序分析 (1)2.1需求分析 (1)2.2功能设计 (1)2.3概要设计....................2-3 2.3.1程序设计思路. (2)2.3.2具体功能设计 (2)2.3.3程序流程图 (3)三、详细设计·····················4-123.1初始化组件 (4)3.2初始化程序数据,绘制程序面板··········4-73.3显示日期的方法·················8-113.4点击按钮产生的效果···············11-12四、运行结果 (13)五、心得体会 (14)六、参考文献 (15)- 0 -一、摘要:万年历是一个强大的日历系统,通过它可以实现对过去,现在以及将来日期的查询,通过在年份对话框中输入要查询的年份,再相应的在月份对应的下拉菜单选择要查询的月份,则可得到相应的日历。

本实验是对图形用户界面,布局管理器的综合运用,理解JAVA的时间处理机制,编写独立运行的窗口。

二、程序分析2.1需求分析本程序的要求为:1.使用图形用户界面;2.本程序能够实现日期与星期的查询。

2.2功能设计本程序要构建的万年历程序,其功能有以下几个方面:1.实现图形界面。

2.能以月历形式显示日期与星期。

工作日、双休日、当天分别以黑色、红色和蓝色显示。

3.支持用户通过下拉形式菜单来选择月份。

4.通过点击“现在日期”来刷新日历。

02.3概要设计2.3.1程序设计思路1.月份总天数的算法:直接根据month_int,即月份序号判断该月的天数。

当month_int等于2时,调用isLeapYear()方法判断是否为闰年。

2.网格内容算法:用dt.getDate()方法算出输出月份第一天为星期几,第一天的格子序号应该为7+第一天的星期序号。

算出输出月份第一天为星期几后,把该日期以前的位置用空格补上,并从该日起一次输出天数直到月底,该月中的天数加上该月一日为星期几的数字再除以7得0换行,即可完整的输出该月的日历。

3.日期颜色的算法:格子数从0开始,第一行为星期序号,则日期从第7格开始。

根据格子序号i进行判断,当i模7余数为0或者6时日期为周末,置为红色;当i等于第一天的格子序号加上当前日期减一时,置为蓝色;其余日期为黑色。

4.如果年份小于2001年大于2031年则程序不予判断。

2.3.2具体功能设计数据选择列表:年份选择列表、月份选择列表。

点击日期跳转按钮,即在日历中显示用户选择日期数据;点击现在日期按钮,即在日历中显示当前日期数据。

122.3.3程序流程图程序流程图是否计算,绘制屏幕是否选择日期 提交年月变更数据程序初始化结束获取当前系统时间年份等数据开始三、详细设计3.1初始化组件import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;3.2初始化程序数据,绘制程序面板在初始化模块中,首先定义一个公共类 CalenderTrain,它继承自JFrame。

ActionListener是一个接口,在实现此接口的类CalenderTrain中,给需要关注其动作的组件跳转按钮button_jump 和现在日期按钮button_today添加监听器(addActionListener(this),之后在事件处理方法public void actionPerformed (ActionEvent e) 中,对每个事件进行不同处理。

在这个类中,定义用到的标签、下拉列表框、按钮,放置面板。

public class CalenderTrain extends JFrame implements ActionListener {JComboBox Month = new JComboBox();JComboBox Year = new JComboBox();JLabel Year_l = new JLabel("年份:");JLabel Month_l = new JLabel("月份:");Date now_date = new Date();JButton[] button_day = new JButton[49];JButton button_jump = new JButton("日期跳转");3JButton button_today = new JButton("现在日期");int now_year = now_date.getYear() + 1900;int now_month = now_date.getMonth();boolean bool = false;String year_int = null;int month_int;JPanel pane_ym = new JPanel();JPanel pane_day = new JPanel();JPanel pane_parent = new JPanel();调用CalenderTrain,设定面板标题为"JAVA日历程序"。

只给窗口设置frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)的话,点击关闭按钮,执行的其实只有把窗口隐藏动作,在任务管理器中可以看到进程仍在运行。

于是加上后面的代码,确保点击关闭,程序直接退出system。

面板的大小设置为不能变化。

public CalenderTrain() {super("JAVA日历程序");setDefaultCloseOperation(DISPOSE_ON_CLOSE); addWindowListener(new WindowAdapter() {public void windowClose(WindowEvent e) {System.exit(0);}});4setResizable(false);设定年月时,规定年份的区间是当前年份的过去10年到当前年份的未来20年,月份区间为正常1-12月。

由于在年份区间中,今年是所有年份中的第十一个,所以Year.setSelectedIndex()的参数为10时,年份刚好是2011。

Pane_ym即放置年月下拉列表框以及两个控制按钮的面板。

给“跳转按钮”和“现在日期”按钮添加监听事件。

for (int i = now_year - 10; i <= now_year + 20; i++) { Year.addItem(i + "");}for (int i = 1; i < 13; i++) {Month.addItem(i + "");}Year.setSelectedIndex(10);button_jump.addActionListener(this);button_today.addActionListener(this);初始化日期按钮并绘制。

由于每一月第一天不能确定,即所在列的位置(星期)不能确定,加上第一行的星期序号,画一个7*7网格布局管理器GridLayout。

GridLayout把容器分成指定行和列的若干个网格,每个组件占一个网格,从左向右、从上到下依次把组件添加进来。

所有的网格都是同样大小的。

GridLayout(7, 7)设置行列数为7*7。

pane_day.setLayout(new GridLayout(7, 7));5for (int i = 0; i < 49; i++) {button_day[i] = new JButton(" ");pane_day.add(button_day[i]);}本程序中,对组件的布置、整形和定位授权给一个布局管理器,由布局管理器来负责。

利用布局管理器可以做到:(1)计算一个容器的所选尺寸和最小尺寸(2)布置一个容器的组件。

这里采用的是BorderLayout,按东南西北和中心将组件布置在容器的四周和中心。

用setContentPane()方法把容器置为JFrame的内容面板。

用pack()方法调整此窗口的大小,以适合其子组件的首选大小和布局实现全部显示,然后用show()方法显示出来。

pane_parent.setLayout(new BorderLayout()); setContentPane(pane_day);setContentPane(pane_ym);pane_parent.add(pane_day, BorderLayout.SOUTH);pane_parent.add(pane_ym, BorderLayout.NORTH); setContentPane(pane_parent);pack();show();}63.3显示日期的方法根据bool的值,由if语句进行判断执行哪一显示日期的语句块,为true时,显示现在的时间;为false时,显示用户选定的时间。

网格第一行,即0至6号格子,内容固定为星期序号,即“星期日”到“星期六”。

void setDay() {if (bool) {year_int = now_year + "";month_int = now_month;} else {year_int = Year.getSelectedItem().toString();month_int = Month.getSelectedIndex();}int year_sel = Integer.parseInt(year_int) - 1900;Date dt = new Date(year_sel, month_int, 1); GregorianCalendar cal = new GregorianCalendar();cal.setTime(dt);String week[] = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" };int day = 0;int day_week = 0;for (int i = 0; i < 7; i++) {7button_day[i].setText(week[i]);}判断当前月份的天数,根据它来设定day的值,其中二月份要判断是否是闰年。

相关文档
最新文档