贴上一期万年历的源代码,与君共享(160行,原创,虽然是简单的applet)
2011-08-30 17:09
197 查看
java source code
import java.applet.Applet; import java.awt.*; import java.util.*; public class CalendarApplet extends Applet{ static final int TOP = 70; //顶端距离 static final int CELLWIDTH=50,CELLHEIGHT = 30; //单元格尺寸 static final int MARGIN = 3; //边界距离 static final int FEBRUARY = 1; TextField tfYear = new TextField("2011", 5); //显示年份的文本域 //Choice monthChoice = new Choice(); //月份选择下拉框 TextField tfMonth = new TextField("5"); Button btUpdate = new Button("更新"); //更新按钮 GregorianCalendar calendar=new GregorianCalendar(); //日历对象 Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); //显示小字体 Font bigFont = new Font("TimesRoman", Font.BOLD, 50); //显示大字体 String days[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; String months[] = {" ","1", "2", "3", "4","5", "6", "7", "8", "9","10", "11", "12"}; int daysInMonth[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //每个月的天数 int searchMonth,searchYear; //查询的年份及月份 public void init() { setBackground(Color.white); //设置背景颜色 searchMonth = calendar.get(Calendar.MONTH); //得到系统月份 searchYear = calendar.get(Calendar.YEAR); //得到系统年份 // add(new Label(" 年:")); //增加组件到Applet tfYear.setText(String.valueOf(searchYear)); //设置文本域文字 add(tfYear); // add(new Label(" 月:")); tfMonth.setText(String.valueOf(searchMonth+1));//初始化月份搜索值为原来月份+1 add(tfMonth); // monthChoice.setFont(smallFont); //设置月份选择下拉框的显示字体 // for (int i = 0; i < 12; i++) { // monthChoice.addItem(months[i]); //增加下拉框选项 // } // monthChoice.select(searchMonth); //设置下拉框当前选择项 // add(monthChoice); add(btUpdate); int componentCount=this.getComponentCount(); //得到Applet中的组件数量 for (int i=0;i<componentCount;i++){ getComponent(i).setFont(smallFont); //设置所有组件的显示字体 } } public void paint(Graphics g){ FontMetrics fontMetric; //显示字体的FontMetrics对象 int fontAscent; int dayPos; int totalWidth, totalHeight; //总的宽度,高度 int numRows; //行数 int xNum, yNum; //水平和垂直方向单元格数量 int numDays; String dayStr; //显示天数字符串 int margin; g.setColor(Color.lightGray); //设置当前颜色 g.setFont(bigFont); //设置当前使用字体 g.drawString(searchYear+"年",60,TOP+70); //绘制字符串 g.drawString((searchMonth+1)+"月",200,TOP+130); g.setColor(Color.black); g.setFont(smallFont); fontMetric = g.getFontMetrics(); //获取变量初值 fontAscent = fontMetric.getAscent(); dayPos = TOP + fontAscent / 2; totalWidth = 7 * CELLWIDTH; //得到总的表格宽度 for (int i = 0; i < 7; i++) { g.drawString(days[i], (CELLWIDTH-fontMetric.stringWidth(days[i]))/2 + i*CELLWIDTH,dayPos-20); //绘制表格标题栏 } numRows = getNumberRows(searchYear, searchMonth); //计算需要的行的数量 totalHeight = numRows * CELLHEIGHT; //得到总的表格高度 for (int i = 0; i <= totalWidth; i += CELLWIDTH) { g.drawLine(i, TOP , i, TOP+ totalHeight); //绘制表格线 } for (int i = 0, j = TOP ; i <= numRows; i++, j += CELLHEIGHT) { g.drawLine(0, j, totalWidth, j); //绘制表格线 } xNum = (getFirstDayOfMonth(searchYear, searchMonth) + 1) * CELLWIDTH - MARGIN; yNum = TOP + MARGIN + fontAscent; numDays = daysInMonth[searchMonth] + ((calendar.isLeapYear(searchYear) && (searchMonth == FEBRUARY)) ? 1 : 0); for (int day = 1; day <= numDays; day++) { dayStr = Integer.toString(day); g.drawString(dayStr, xNum - fontMetric.stringWidth(dayStr), yNum); //绘制字符串 xNum += CELLWIDTH; if (xNum > totalWidth) { xNum = CELLWIDTH - MARGIN; yNum += CELLHEIGHT; } } } public boolean action(Event e, Object o){ int searchYearInt,searchMonthInt; if (e.target==btUpdate){ // searchMonth = monthChoice.getSelectedIndex(); //得到查询月份 searchMonthInt=Integer.parseInt(tfMonth.getText(), 10); searchYearInt = Integer.parseInt(tfYear.getText(), 10); //得到查询年份 if (searchYearInt > 1581) { searchYear = searchYearInt; } repaint(); //重绘屏幕 if((searchMonthInt>=1)&&(searchMonthInt<=12)) //月份大于等于1并且小于等于12 { searchMonth=searchMonthInt-1; //数组里面是从下标为0的数组开始,表示一月份,所以MonthInt-1 } repaint(); return true; } return false; } private int getNumberRows(int year, int month) { //得到行数量 int firstDay; int numCells; if (year < 1582) { //年份小于1582年,则返回-1 return (-1); } if ((month < 0) || (month > 11)) { return (-1); } firstDay = getFirstDayOfMonth(year, month); //计算月份的第一天 if ((month == FEBRUARY) && (firstDay == 0) && !calendar.isLeapYear(year)) { return 4; } numCells = firstDay + daysInMonth[month]; if ((month == FEBRUARY) && (calendar.isLeapYear(year))) { numCells++; } return ((numCells <= 35) ? 5 : 6); //返回行数 } private int getFirstDayOfMonth(int year, int month) { //得到每月的第一天 int firstDay; int i; if (year < 1582) { //年份小于1582年,返回-1 return (-1); } if ((month < 0) || (month > 11)) { //月份数错误,返回-1 return (-1); } firstDay = getFirstDayOfYear(year); //得到每年的第一天 for (i = 0; i < month; i++) { firstDay += daysInMonth[i]; //计算每月的第一天 } if ((month > FEBRUARY) && calendar.isLeapYear(year)) { firstDay++; } return (firstDay % 7); } private int getFirstDayOfYear(int year){ //计算每年的第一天 int leapYears; int hundreds; int fourHundreds; int first; if (year < 1582) { //如果年份小于1582年 return (-1); //返回-1 } leapYears = (year - 1581) / 4; hundreds = (year - 1501) / 100; leapYears -= hundreds; fourHundreds = (year - 1201) / 400; leapYears += fourHundreds; first=5 + (year - 1582) + leapYears % 7; //得到每年第一天 return first; } }
运行环境:jdk7+eclipse helios3.2+windows 7
相关文章推荐
- (原创)Linux跟Window共享文件的两个简单方法
- 原创 通用源代码重命名工具,简单易用,但很强大
- 我的源代码(php实现的简单万年历)
- Python机器学习中的实用小操作(一):数据清理篇 阿萨姆 2 个月前 0. 背景 很多朋友评论希望我共享答案和文章中提到的操作代码,比如生成相关性图谱等。为了方便大家,开始介绍一些虽然简单但很有用
- x264源代码简单分析:宏块编码(Encode)部分
- [原创]一个简单的药店用的会员积分管理系统
- ui-route的一般用法 ,比较简单。在平时项目也用到,但是我也要记下来,虽然是'借鉴的',取其精华
- java applet 简单实例
- 【原创】TCP Socket 简单练习 --- 线程池实现并发服务器
- PHP简单实现HTTP和HTTPS跨域共享session解决办法
- (备忘,非原创)一个简单的php中使用的mysql类
- 一个超级简单的HTML模板框架源代码以及使用示例
- linux两个程序通过共享内存通信的一个简单例子
- 原创:用磁盘工具UltraISO.exe简单几步制作U盘启动的PE系统盘。
- 可以说是全世界最简单的VB动态调用外部函数(附源代码)
- 视频教程+源代码:FLEX+FMS实现远程共享、电子白板、远程交流会议
- 这才是创造,虽然简单,但是有价值
- UESTC 58 任意阶矩阵的乘法 虽然简单但优化还是要思考一下的 而且也使自己意识到了原来没有注意的问题
- 一个共享XP、2003上文件与打印机简单易行的方法
- 一个简单的计算器源代码[VC6]