老乡问我,在网上找了下,修改修改,就成了下面的样子!

《面向对象程序设计》

课程设计题

 

任选一题完成,使用SWING组件构建图形用户界面。

提交内容:基本设计思想、UML类图、全部源代码。

 

一、编写一个万年历显示程序(公历)。

日历范围:1900年至2100年

下拉列表选择年份、月份,屏幕下方显示指定月份的每一天是几号(一个星期一行)。

代码:

  1. import java.applet.Applet;  
  2. import java.awt.*;  
  3. import java.util.*;  
  4.  
  5. public class CalendarApplet extends Applet {  
  6.  
  7. static final int TOP = 70; // 顶端距离  
  8. static final int CELLWIDTH = 50, CELLHEIGHT = 30; // 单元格尺寸  
  9. static final int MARGIN = 5; // 边界距离  
  10. static final int FEBRUARY = 1;  
  11.  
  12. TextField tfYear = new TextField(Calendar.YEAR+"", 5); // 显示年份的文本域  
  13. Choice yearChoice = new Choice(); // 年选择下拉框  
  14. Choice monthChoice = new Choice(); // 月份选择下拉框  
  15. // Button btUpdate = new Button("更新"); // 更新按钮  
  16. GregorianCalendar calendar = new GregorianCalendar(); // 日历对象  
  17. Font smallFont = new Font("TimesRoman", Font.PLAIN, 15); // 显示小字体  
  18. Font bigFont = new Font("TimesRoman", Font.BOLD, 50); // 显示大字体  
  19. String days[] = { "日""一""二""三""四""五""六" };  
  20. String months[] = { "1""2""3""4""5""6""7""8""9","10""11""12" };  
  21. int daysInMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; // 每个月的天数  
  22. int searchMonth, searchYear; // 查询的年份及月份  
  23.  
  24. public void init() {  
  25. // setPreferredSize(new Dimension(600,600));  
  26. setBackground(Color.white); // 设置背景颜色  
  27. searchMonth = calendar.get(Calendar.MONTH); // 得到系统月份  
  28. searchYear = calendar.get(Calendar.YEAR); // 得到系统年份  
  29.  
  30. // tfYear.setText(String.valueOf(searchYear)); // 设置文本域文字  
  31. // add(tfYear);  
  32. monthChoice.setFont(smallFont); // 设置月份选择下拉框的显示字体  
  33. for (int i &#61; 0; i < 12; i&#43;&#43;) {  
  34. monthChoice.addItem(months[i]); // 增加下拉框选项  
  35. }  
  36. monthChoice.select(searchMonth); // 设置下拉框当前选择项  
  37. for (int i &#61; 1900; i <&#61; 2100; i&#43;&#43;) {  
  38. yearChoice.addItem(i&#43;""); // 增加下拉框选项  
  39. }  
  40. yearChoice.select(searchYear&#43;""); // 设置下拉框当前选择项  
  41. add(yearChoice);  
  42. add(new Label(" 年")); // 增加组件到Applet  
  43. add(monthChoice);  
  44. add(new Label(" 月"));  
  45. // add(btUpdate);  
  46. int componentCount &#61; this.getComponentCount(); // 得到Applet中的组件数量  
  47. for (int i &#61; 0; i < componentCount; i&#43;&#43;) {  
  48. getComponent(i).setFont(smallFont); // 设置所有组件的显示字体  
  49. }  
  50. }  
  51.  
  52. public void paint(Graphics g) {  
  53. FontMetrics fontMetric; // 显示字体的FontMetrics对象  
  54. int fontAscent;  
  55. int dayPos;  
  56. int totalWidth, totalHeight; // 总的宽度,高度  
  57. int numRows; // 行数  
  58. int xNum, yNum; // 水平和垂直方向单元格数量  
  59. int numDays;  
  60. String dayStr; // 显示天数字符串  
  61. int margin&#61;5;  
  62.  
  63.  
  64. g.setColor(Color.lightGray); // 设置当前颜色  
  65. g.setFont(bigFont); // 设置当前使用字体  
  66. g.drawString(searchYear &#43; "年", 60, TOP &#43; 70); // 绘制字符串  
  67. g.drawString((searchMonth &#43; 1) &#43; "月", 200, TOP &#43; 130);  
  68.  
  69. g.setColor(Color.black);  
  70. g.setFont(smallFont);  
  71. fontMetric &#61; g.getFontMetrics(); // 获取变量初值  
  72. fontAscent &#61; fontMetric.getAscent();  
  73. dayPos &#61; TOP &#43; fontAscent / 2;  
  74. totalWidth &#61; 7 * CELLWIDTH; // 得到总的表格宽度  
  75. for (int i &#61; 0; i < 7; i&#43;&#43;) {  
  76. g.drawString(days[i], (CELLWIDTH - fontMetric.stringWidth(days[i]))  
  77. / 2 &#43; i * CELLWIDTH, dayPos - 20); // 绘制表格标题栏  
  78. }  
  79. numRows &#61; getNumberRows(searchYear, searchMonth); // 计算需要的行的数量  
  80. totalHeight &#61; numRows * CELLHEIGHT; // 得到总的表格高度  
  81. for (int i &#61; 0; i <&#61; totalWidth; i &#43;&#61; CELLWIDTH) {  
  82. g.drawLine(i, TOP, i, TOP &#43; totalHeight); // 绘制表格线  
  83. }  
  84. for (int i &#61; 0, j &#61; TOP; i <&#61; numRows; i&#43;&#43;, j &#43;&#61; CELLHEIGHT) {  
  85. g.drawLine(0, j, totalWidth, j); // 绘制表格线  
  86. }  
  87. xNum &#61; (getFirstDayOfMonth(searchYear, searchMonth) &#43; 1) * CELLWIDTH  
  88. - MARGIN;  
  89. yNum &#61; TOP &#43; MARGIN &#43; fontAscent;  
  90. numDays &#61; daysInMonth[searchMonth]  
  91. &#43; ((calendar.isLeapYear(searchYear) && (searchMonth &#61;&#61; FEBRUARY)) ? 1  
  92. : 0);  
  93. for (int day &#61; 1; day <&#61; numDays; day&#43;&#43;) {  
  94. dayStr &#61; Integer.toString(day);  
  95. g.drawString(dayStr, xNum - fontMetric.stringWidth(dayStr), yNum); // 绘制字符串  
  96. xNum &#43;&#61; CELLWIDTH;  
  97. if (xNum > totalWidth) {  
  98. xNum &#61; CELLWIDTH - MARGIN;  
  99. yNum &#43;&#61; CELLHEIGHT;  
  100. }  
  101. }  
  102. }  
  103.  
  104. /**  
  105. * 事件监听  
  106. */  
  107. public boolean action(Event e, Object o) {  
  108. int searchYearInt;  
  109. if (e.target &#61;&#61;yearChoice||e.target &#61;&#61;monthChoice) {  
  110. searchMonth &#61; monthChoice.getSelectedIndex(); // 得到查询月份  
  111. searchYear &#61; Integer.parseInt(yearChoice.getSelectedItem());  
  112. searchYearInt &#61; searchYear; // 得到查询年份  
  113. if (searchYearInt > 1581) {  
  114. searchYear &#61; searchYearInt;  
  115. }  
  116.  
  117. repaint(); // 重绘屏幕  
  118. return true;  
  119. }  
  120. return false;  
  121. }  
  122.  
  123. private int getNumberRows(int yearint month) { // 得到行数量  
  124. int firstDay;  
  125. int numCells;  
  126. if (year < 1582) { // 年份小于1582年&#xff0c;则返回-1  
  127. return (-1);  
  128. }  
  129. if ((month < 0) || (month > 11)) {  
  130. return (-1);  
  131. }  
  132. firstDay &#61; getFirstDayOfMonth(yearmonth); // 计算月份的第一天  
  133.  
  134. if ((month &#61;&#61; FEBRUARY) && (firstDay &#61;&#61; 0)  
  135. && !calendar.isLeapYear(year)) {  
  136. return 4;  
  137. }  
  138. numCells &#61; firstDay &#43; daysInMonth[month];  
  139. if ((month &#61;&#61; FEBRUARY) && (calendar.isLeapYear(year))) {  
  140. numCells&#43;&#43;;  
  141. }  
  142. return ((numCells <&#61; 35) ? 5 : 6); // 返回行数  
  143. }  
  144.  
  145. /**  
  146. * 得到指定年月的第一天  
  147. * &#64;param year 
  148. * &#64;param month 
  149. * &#64;return 
  150. */  
  151. private int getFirstDayOfMonth(int yearint month) { // 得到每月的第一天  
  152. int firstDay;  
  153. int i;  
  154. if (year < 1582) { // 年份小于1582年,返回-1  
  155. return (-1);  
  156. }  
  157. if ((month < 0) || (month > 11)) { // 月份数错误,返回-1  
  158. return (-1);  
  159. }  
  160. firstDay &#61; getFirstDayOfYear(year); // 得到每年的第一天  
  161. for (i &#61; 0; i < month; i&#43;&#43;) {  
  162. firstDay &#43;&#61; daysInMonth[i]; // 计算每月的第一天  
  163. }  
  164. if ((month > FEBRUARY) && calendar.isLeapYear(year)) {  
  165. firstDay&#43;&#43;;  
  166. }  
  167. return (firstDay % 7);  
  168. }  
  169.  
  170. /**  
  171. * 得到指定年的第一天  
  172. * &#64;param year 
  173. * &#64;return 
  174. */  
  175. private int getFirstDayOfYear(int year) { // 计算每年的第一天  
  176. int leapYears;  
  177. int hundreds;  
  178. int fourHundreds;  
  179. int first;  
  180. if (year < 1582) { // 如果年份小于1582年  
  181. return (-1); // 返回-1  
  182. }  
  183. leapYears &#61; (year - 1581) / 4;  
  184. hundreds &#61; (year - 1501) / 100;  
  185. leapYears -&#61; hundreds;  
  186. fourHundreds &#61; (year - 1201) / 400;  
  187. leapYears &#43;&#61; fourHundreds;  
  188. first &#61; 5 &#43; (year - 1582) &#43; leapYears % 7; // 得到每年第一天  
  189. return first;  
  190. }  
  191. }