老乡问我,在网上找了下,修改修改,就成了下面的样子!
《面向对象程序设计》
课程设计题
任选一题完成,使用SWING组件构建图形用户界面。
提交内容:基本设计思想、UML类图、全部源代码。
一、编写一个万年历显示程序(公历)。
日历范围:1900年至2100年
下拉列表选择年份、月份,屏幕下方显示指定月份的每一天是几号(一个星期一行)。
代码:
- 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 = 5; // 边界距离
- static final int FEBRUARY = 1;
- TextField tfYear = new TextField(Calendar.YEAR+"", 5); // 显示年份的文本域
- Choice yearChoice = new Choice(); // 年选择下拉框
- Choice monthChoice = new Choice(); // 月份选择下拉框
- // 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[] = { "日", "一", "二", "三", "四", "五", "六" };
- 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() {
- // setPreferredSize(new Dimension(600,600));
- setBackground(Color.white); // 设置背景颜色
- searchMonth = calendar.get(Calendar.MONTH); // 得到系统月份
- searchYear = calendar.get(Calendar.YEAR); // 得到系统年份
- // tfYear.setText(String.valueOf(searchYear)); // 设置文本域文字
- // add(tfYear);
- monthChoice.setFont(smallFont); // 设置月份选择下拉框的显示字体
- for (int i &#61; 0; i < 12; i&#43;&#43;) {
- monthChoice.addItem(months[i]); // 增加下拉框选项
- }
- monthChoice.select(searchMonth); // 设置下拉框当前选择项
- for (int i &#61; 1900; i <&#61; 2100; i&#43;&#43;) {
- yearChoice.addItem(i&#43;""); // 增加下拉框选项
- }
- yearChoice.select(searchYear&#43;""); // 设置下拉框当前选择项
- add(yearChoice);
- add(new Label(" 年")); // 增加组件到Applet
- add(monthChoice);
- add(new Label(" 月"));
- // add(btUpdate);
- int componentCount &#61; this.getComponentCount(); // 得到Applet中的组件数量
- for (int i &#61; 0; i < componentCount; i&#43;&#43;) {
- 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&#61;5;
- g.setColor(Color.lightGray); // 设置当前颜色
- g.setFont(bigFont); // 设置当前使用字体
- g.drawString(searchYear &#43; "年", 60, TOP &#43; 70); // 绘制字符串
- g.drawString((searchMonth &#43; 1) &#43; "月", 200, TOP &#43; 130);
- g.setColor(Color.black);
- g.setFont(smallFont);
- fontMetric &#61; g.getFontMetrics(); // 获取变量初值
- fontAscent &#61; fontMetric.getAscent();
- dayPos &#61; TOP &#43; fontAscent / 2;
- totalWidth &#61; 7 * CELLWIDTH; // 得到总的表格宽度
- for (int i &#61; 0; i < 7; i&#43;&#43;) {
- g.drawString(days[i], (CELLWIDTH - fontMetric.stringWidth(days[i]))
- / 2 &#43; i * CELLWIDTH, dayPos - 20); // 绘制表格标题栏
- }
- numRows &#61; getNumberRows(searchYear, searchMonth); // 计算需要的行的数量
- totalHeight &#61; numRows * CELLHEIGHT; // 得到总的表格高度
- for (int i &#61; 0; i <&#61; totalWidth; i &#43;&#61; CELLWIDTH) {
- g.drawLine(i, TOP, i, TOP &#43; totalHeight); // 绘制表格线
- }
- for (int i &#61; 0, j &#61; TOP; i <&#61; numRows; i&#43;&#43;, j &#43;&#61; CELLHEIGHT) {
- g.drawLine(0, j, totalWidth, j); // 绘制表格线
- }
- xNum &#61; (getFirstDayOfMonth(searchYear, searchMonth) &#43; 1) * CELLWIDTH
- - MARGIN;
- yNum &#61; TOP &#43; MARGIN &#43; fontAscent;
- numDays &#61; daysInMonth[searchMonth]
- &#43; ((calendar.isLeapYear(searchYear) && (searchMonth &#61;&#61; FEBRUARY)) ? 1
- : 0);
- for (int day &#61; 1; day <&#61; numDays; day&#43;&#43;) {
- dayStr &#61; Integer.toString(day);
- g.drawString(dayStr, xNum - fontMetric.stringWidth(dayStr), yNum); // 绘制字符串
- xNum &#43;&#61; CELLWIDTH;
- if (xNum > totalWidth) {
- xNum &#61; CELLWIDTH - MARGIN;
- yNum &#43;&#61; CELLHEIGHT;
- }
- }
- }
- /**
- * 事件监听
- */
- public boolean action(Event e, Object o) {
- int searchYearInt;
- if (e.target &#61;&#61;yearChoice||e.target &#61;&#61;monthChoice) {
- searchMonth &#61; monthChoice.getSelectedIndex(); // 得到查询月份
- searchYear &#61; Integer.parseInt(yearChoice.getSelectedItem());
- searchYearInt &#61; searchYear; // 得到查询年份
- if (searchYearInt > 1581) {
- searchYear &#61; searchYearInt;
- }
- repaint(); // 重绘屏幕
- return true;
- }
- return false;
- }
- private int getNumberRows(int year, int month) { // 得到行数量
- int firstDay;
- int numCells;
- if (year < 1582) { // 年份小于1582年&#xff0c;则返回-1
- return (-1);
- }
- if ((month < 0) || (month > 11)) {
- return (-1);
- }
- firstDay &#61; getFirstDayOfMonth(year, month); // 计算月份的第一天
- if ((month &#61;&#61; FEBRUARY) && (firstDay &#61;&#61; 0)
- && !calendar.isLeapYear(year)) {
- return 4;
- }
- numCells &#61; firstDay &#43; daysInMonth[month];
- if ((month &#61;&#61; FEBRUARY) && (calendar.isLeapYear(year))) {
- numCells&#43;&#43;;
- }
- return ((numCells <&#61; 35) ? 5 : 6); // 返回行数
- }
- /**
- * 得到指定年月的第一天
- * &#64;param year
- * &#64;param month
- * &#64;return
- */
- 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 &#61; getFirstDayOfYear(year); // 得到每年的第一天
- for (i &#61; 0; i < month; i&#43;&#43;) {
- firstDay &#43;&#61; daysInMonth[i]; // 计算每月的第一天
- }
- if ((month > FEBRUARY) && calendar.isLeapYear(year)) {
- firstDay&#43;&#43;;
- }
- return (firstDay % 7);
- }
- /**
- * 得到指定年的第一天
- * &#64;param year
- * &#64;return
- */
- private int getFirstDayOfYear(int year) { // 计算每年的第一天
- int leapYears;
- int hundreds;
- int fourHundreds;
- int first;
- if (year < 1582) { // 如果年份小于1582年
- return (-1); // 返回-1
- }
- leapYears &#61; (year - 1581) / 4;
- hundreds &#61; (year - 1501) / 100;
- leapYears -&#61; hundreds;
- fourHundreds &#61; (year - 1201) / 400;
- leapYears &#43;&#61; fourHundreds;
- first &#61; 5 &#43; (year - 1582) &#43; leapYears % 7; // 得到每年第一天
- return first;
- }
- }