下一天(Java swing写的一个日历小程序)

来源:互联网 发布:java异或运算有什么用 编辑:程序博客网 时间:2024/05/22 02:23

同样,还是一个作业。
软件测试与质量保证的作业。
我写代码。
不用我测试。
下面贴代码。
贴图:
这里写图片描述

程序入口:

package guoyang;public class Main {    public static void main(String[] args) {        MainFrame m = new MainFrame("NextDate");        m.setVisible(true);    }}
package guoyang;import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.BorderFactory;import javax.swing.Box;import javax.swing.BoxLayout;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.SwingConstants;import javax.swing.border.EmptyBorder;/** * @author guoyang * */public class MainFrame extends JFrame {    private JPanel sunPane;// 阳历面板    private JPanel moonPane;// 阴历面板    private JLabel[] labels;// 日期小格子    private int[] months = new int[12];// 阳历每月天数    private int day = 1;// 阳历几号    private int month = 1;// 阳历几月    private int year = 1900;// 阳历年    private int weekDay = 0;// 阳历周几    private int sumDayToStart = 0;// 距离1900年1月1日过去了多少天    private String moonCalendar = "";// 农历几月初几    private String ganzhiCalendar = "";// 农历天干地支纪年纪月纪日    private String shengxiaoYear = "";// 农历生肖    private JComboBox<String> yearBox;// 年份选择    private JComboBox<String> monthBox;// 月份选择    private JLabel dateLabel;// 日期标签    private JLabel moonLabel = new JLabel("");     private JLabel ganzhiLabel = new JLabel("");    private JLabel shengxiaoLabel = new JLabel("");    private int[] moon = new int[] { 0x04bd8, 0x04ae0, 0x0a570, 0x054d5,            0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, 0x04ae0,            0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2,            0x095b0, 0x14977, 0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40,            0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, 0x06566, 0x0d4a0,            0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7,            0x0c950, 0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0,            0x092d0, 0x0d2b2, 0x0a950, 0x0b557, 0x06ca0, 0x0b550, 0x15355,            0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0,            0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263,            0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0,            0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, 0x095b0,            0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46,            0x0ab60, 0x09570, 0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50,            0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, 0x0c960, 0x0d954,            0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0,            0x0cab5, 0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0,            0x0a5b0, 0x15176, 0x052b0, 0x0a930, 0x07954, 0x06aa0, 0x0ad50,            0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530,            0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6,            0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2, 0x049b0,            0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, 0x14b63,            0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20,            0x1a6c4, 0x0aae0, 0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0,            0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, 0x052d0, 0x0a9b8,            0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0,            0x052b0, 0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55,            0x04b60, 0x0a570, 0x054e4, 0x0d160, 0x0e968, 0x0d520, 0x0daa0,            0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252,            0x0d520 };    private String[] gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",            "辛", "壬", "癸" };    private String[] zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午",            "未", "申", "酉", "戌", "亥" };    private String[] shengxiao = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇",            "马", "羊", "猴", "鸡", "狗", "猪" };    public MainFrame(String name) {        super(name);        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        setBounds(100, 100, 450, 300);        // System.out.println(moon.length);        init();    }    private void init() {        sunPane = new JPanel(new BorderLayout());        moonPane = new JPanel(new FlowLayout());        JPanel contentPane = new JPanel(new BorderLayout());        contentPane.add(sunPane, BorderLayout.CENTER);        contentPane.add(moonPane, BorderLayout.EAST);        this.add(contentPane);        JLabel nongli = new JLabel("农历");        nongli.setFont(new Font("微软雅黑", 1, 48));        moonPane.setLayout(new BoxLayout(moonPane, BoxLayout.Y_AXIS));        moonPane.add(nongli);        moonPane.setPreferredSize(new Dimension(150,30));        moonPane.add(moonLabel);        moonPane.add(ganzhiLabel);        moonPane.add(shengxiaoLabel);        moonLabel.setFont(new Font("微软雅黑", 1, 24));        ganzhiLabel.setFont(new Font("微软雅黑", 1, 24));        shengxiaoLabel.setFont(new Font("微软雅黑", 1, 24));        JPanel upPane = new JPanel();        sunPane.add(upPane, BorderLayout.NORTH);        yearBox = new JComboBox<String>();        monthBox = new JComboBox<String>();        JButton nextDate = new JButton("下一天");        for (int i = 1900; i <= 2100; i++) {            yearBox.addItem(i + "");        }        for (int i = 1; i <= 12; i++) {            monthBox.addItem(i + "月");        }        dateLabel = new JLabel(year + "-" + month + "-" + day);        upPane.add(yearBox);        upPane.add(monthBox);        upPane.add(nextDate);        upPane.add(dateLabel);        JPanel display = new JPanel(new GridLayout(7, 7));        sunPane.add(display, BorderLayout.CENTER);        labels = new JLabel[49];        for (int i = 0; i < 49; i++) {            labels[i] = new JLabel(" ", JLabel.CENTER);            if (i > 6) {                labels[i].addMouseListener(new MyLabelMouseAdapter());            }            display.add(labels[i]);        }        labels[0].setText("日");        labels[1].setText("一");        labels[2].setText("二");        labels[3].setText("三");        labels[4].setText("四");        labels[5].setText("五");        labels[6].setText("六");        for (int i = 0; i < 7; i++) {            labels[i].setForeground(Color.blue);            labels[i].setBackground(Color.lightGray);            labels[i].setOpaque(true);        }        moonPane.setBackground(Color.ORANGE);        //JLabel moonLabel = new JLabel(" 农历 ");        months[0] = 31; // 一月        months[1] = 28; // 二月        months[2] = 31; // 三月        months[3] = 30; // 四月        months[4] = 31; // 五月        months[5] = 30; // 六月        months[6] = 31; // 七月        months[7] = 31; // 八月        months[8] = 30; // 九月        months[9] = 31; // 十月        months[10] = 30; // 十一月        months[11] = 31; // 十二月        yearBox.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                refresh();            }        });        monthBox.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                refresh();            }        });        nextDate.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // 下一天                if (month == 12 && day == 31) {                    year += 1;                    yearBox.setSelectedIndex(year - 1900);                    month = 1;                    monthBox.setSelectedIndex(month - 1);                    day = 1;                } else if (day == months[month - 1])// 每月的最后一天                {                    month += 1;                    monthBox.setSelectedIndex(month - 1);                    day = 1;                } else {                    day += 1;                }                refresh();            }        });        setCalendar(year, month);    }    /**     * 设置日历,返回当月的第一天是周几,从0开始计数     *      * @param year     * @param month     */    public void setCalendar(int year, int month) {        // int weekDay = 0;//该月份的第一天是周几,从0开始计数,0表示周一        sumDayToStart = 0;        for (int i = 1900; i < year; i++) {            if (isLeepYear(i)) {                sumDayToStart += 366;            } else {                sumDayToStart += 365;            }        }        if (isLeepYear(year)) {            months[1] = 29;        } else {            months[1] = 28;        }        for (int i = 0; i < month - 1; i++) {            sumDayToStart += months[i];        }        weekDay = sumDayToStart % 7;        // 清空日历        for (int i = 0; i < 42; i++) {            labels[i + 7].setText(" ");            labels[i + 7].setForeground(Color.BLACK);            labels[i + 7].setBackground(this.getBackground());        }        for (int i = 0; i < months[month - 1]; i++) {            labels[weekDay + 7 + i + 1].setText(i + 1 + "");        }        labels[weekDay + day + 7].setForeground(Color.RED);        labels[weekDay + day + 7].setBackground(Color.WHITE);        labels[weekDay + day + 7].setOpaque(true);        sumDayToStart += day;    }    /**     * 判断是否为闰年     *      * @param year     * @return     */    public boolean isLeepYear(int year) {        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {            return true;        }        return false;    }    public void refresh() {        year = yearBox.getSelectedIndex() + 1900;        month = monthBox.getSelectedIndex() + 1;        setCalendar(year, month);        dateLabel.setText(year + "-" + month + "-" + day);        getMoonCalendar();        /*this.ganzhiLabel.setHorizontalAlignment(SwingConstants.CENTER);        this.moonLabel.setHorizontalAlignment(SwingConstants.CENTER);        this.ganzhiLabel.setHorizontalAlignment(SwingConstants.CENTER);*/        this.ganzhiLabel.setText(ganzhiCalendar);        this.moonLabel.setText(moonCalendar);        this.shengxiaoLabel.setText(shengxiaoYear+"年");        System.out.println(moonCalendar+" "+ganzhiCalendar+" "+shengxiaoYear);    }    private class MyLabelMouseAdapter extends MouseAdapter {        public void mouseClicked(MouseEvent e) {            JLabel clickedLabel = (JLabel) e.getSource();            for (int i = 7; i < 49; i++) {                if (labels[i].equals(clickedLabel)) {                    day = i - 7 - weekDay;                }            }            refresh();        }    }    /**     * 计算是否为农历闰年     *      * @param yearIndex     *            ,年份索引,从0到200     * @return     */    private boolean isMoonLeapYear(int yearIndex) {        return (0x10000 & moon[year]) == 0x10000;    }    /**     * 计算农历每年每月有多少天     *      * @param year     *            ,年份索引,从0到200     * @return     */    private int[] getMoonMonthDay(int year) {        int[] months = new int[12];        for (int i = 0; i < 12; i++) {            if ((moon[year] & (0x10000 >>> (i + 1))) == (0x10000 >>> (i + 1))) {                months[i] = 30;            } else {                months[i] = 29;            }        }        return months;    }    /**     * 获得农历日期,第多少年,第几月,第几天     */    private void getMoonCalendar() {        int year = 0;        int month = 0;        int day = 0;        int sum = 0;        if (this.sumDayToStart < 31) {            year = -1;            month = 11;            day = this.sumDayToStart;        } else {            sumDayToStart -= 30;            while (sum + getMoonYearDays(year) < this.sumDayToStart) {                sum += getMoonYearDays(year);                year++;            }            int leapMonth = 0;            int leapMonthDay = 0;            int i = 0;            int[] months = getMoonMonthDay(year);            if (moon[year] % 16 != 0) { // 该年是阴历闰年                if ((moon[year] & 0x10000) == 0x10000) { // 该年闰大月                    leapMonthDay = 30;                } else { // 该年闰小月                    leapMonthDay = 29;                }                leapMonth = moon[year] % 16; // 闰几月                for (i = 0; i < leapMonth; i++) {                    if (sum + months[i] < sumDayToStart) {                        sum += months[i];                    } else {                        break;                    }                }                if (i == leapMonth) { // 超过闰月了                    if (sum + leapMonthDay < sumDayToStart) {                        sum += leapMonthDay;                        for (i = leapMonth; i < 12; i++) {                            if (sum + months[i] < sumDayToStart) {                                sum += months[i];                            } else {                                break;                            }                        }                        month = i;                        day = sumDayToStart - sum;                    } else { // 在闰几月的时候停下                        day = sumDayToStart - sum;                    }                } else {                    month = i;                    day = sumDayToStart - sum;                }            } else {                for (i = 0; i < 12; i++) {                    if (sum + months[i] < sumDayToStart) {                        sum += months[i];                    } else {                        break;                    }                }                month = i;                day = sumDayToStart - sum;            }        }        // System.out.println("阴历一年多少天"+getMoonYearDays(year));        this.moonCalendar=getYinliMonth(month)+getYinliDay(day);        this.shengxiaoYear=shengxiao[(year+12)%12];        /*System.out.println(this.moonCalendar);        System.out.println(shengxiao[(year+12)%12]);        System.out.println("阳历:" + this.year + "-" + this.month + "-"                + this.day + "阴历:" + year + "-" + month + "-" + day);// 测试农历几月初几*/      this.ganzhiCalendar=getGanZhi(year, month, day);        /*System.out.println(ganzhiCalendar);*/    }    /**     * 计算农历每年共有多少天     *      * @param yearIndex     *            ,年份索引,从0到200     * @return     */    private int getMoonYearDays(int yearIndex) {        int sumDay = 0;        int[] months = getMoonMonthDay(yearIndex);        for (int i = 0; i < 12; i++) {            sumDay += months[i];        }        if (moon[yearIndex] % 16 != 0) {            if ((moon[yearIndex] & 0x10000) == 0x10000) {                sumDay += 30;            } else {                sumDay += 29;            }        }        return sumDay;    }    private String getYinliMonth(int month){        switch(month){        case 0:            return "正月";        case 1:            return "二月";        case 2:            return "三月";        case 3:            return "四月";        case 4:            return "五月";        case 5:            return "六月";        case 6:            return "七月";        case 7:            return "八月";        case 8:            return "九月";        case 9:            return "十月";        case 10:            return "十一月";        case 11:            return "腊月";        }        return "";    }    private String getYinliDay(int day){        switch(day){        case 1:            return "初一";        case 2:            return "初二";        case 3:            return "初三";        case 4:            return "初四";        case 5:            return "初五";        case 6:            return "初六";        case 7:            return "初七";        case 8:            return "初八";        case 9:            return "初九";        case 10:            return "初十";        case 11:            return "十一";        case 12:            return "十二";        case 13:            return "十三";        case 14:            return "十四";        case 15:            return "十五";        case 16:            return "十六";        case 17:            return "十七";        case 18:            return "二十八";        case 19:            return "十九";        case 20:            return "二十";        case 21:            return "二十一";        case 22:            return "二十二";        case 23:            return "二十三";        case 24:            return "二十四";        case 25:            return "二十五";        case 26:            return "二十六";        case 27:            return "二十七";        case 28:            return "二十八";        case 29:            return "二十九";        case 30:            return "三十";        }        return "";    }    private String getGanZhi(int year,int month,int day){        year=year+36;        String ganzhiYear="";        String ganzhiMonth="";        String[] ganzhi = new String[60];        for(int i=0,j=0,k=0;k<60;i=(++i)%10,j=(++j)%12,k++){            ganzhi[k] = gan[i]+zhi[j];        }        ganzhiYear=ganzhi[year%60]+"年";        ganzhiMonth=ganzhi[(year*12+month+1)%60]+"月";        System.out.println((year*12+month+1)%60);        return ganzhiYear+ganzhiMonth;    }}
0 0
原创粉丝点击