精华内容
下载资源
问答
  • java万年历

    2018-04-09 22:22:22
    打印万年历(输入年份,月份,输出该月的日历,已知1900年1月1日是星期一),要求: (1)编写一个方法判断闰年; (2)编写一个方法判断某年某月有多少天; (3)编写一个方法计算某年某月前距离1900年1月1日的总天数; ...
  • java万年历源程序

    2016-01-06 21:34:41
    java万年历源程序 适合课程设计 非常不错
  • java万年历和设计文档

    2019-03-15 13:47:49
    实现一个万年历,使用图形化界面,实现日期与星期的查询
  • Java万年历源代码

    2010-09-19 09:57:16
    Java实现的万年历源码,涉及到Java集合类、图形用于界面、多线程、异常等知识。
  • java 万年历

    千次阅读 2009-10-24 21:10:00
    import java.awt.BorderLayout;import java.awt.Color;import java.awt.Container;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionL

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseWheelEvent;
    import java.awt.event.MouseWheelListener;
    import java.util.Calendar;
    import java.util.GregorianCalendar;

    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;

    public class Main extends JFrame implements ActionListener, MouseWheelListener {

        private static final long serialVersionUID = 7499985850889594686L;
        // 所有的组件都添加到此面板上后添加到jframe 中显示
        JPanel parent = null;

        JTextField yearField = null;
        JTextField monthField = null;

        JPanel datePanel = null;

        JPanel south = new JPanel();
        // 每行七个,其6行
        JLabel[] days = new JLabel[6 * 7];
        Font f = new Font("Arial", Font.BOLD, 14);

        Calendar c = new java.util.GregorianCalendar();
        Week week = new Week(c);
        Clock2 clock = new Clock2(this);
        Lunar lunar = new Lunar(c);

        public Main() {
            jsInit();
        }

        private void jsInit() {
            this.setTitle("简易万年历for LGC");
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(new BorderLayout());

            Container c = this.getContentPane();
            parent = new JPanel();
            datePanel = new JPanel();
            datePanel.setBackground(Color.green);
            // parent.setBackground(Color.GREEN);
            c.add(parent);
            for (int i = 0; i < days.length; i++) {
                days[i] = new JLabel();
            }

            // 添加各种组件
            addC();

            // 添加listener
            addLis();

            this.setResizable(false);
            this.setBounds(60, 60, 350, 280);
            this.setVisible(true);

        }

        private void addLis() {
            yearField.addActionListener(this);
            monthField.addActionListener(this);
            parent.addMouseWheelListener(this);

        }

        // 添加组件
        public void addC() {
            // 在其中添加星期信息,并提供一个field 用来输入年月
            addInputField();

            // 添加日期信息
            addDatesPanel();
            // 添加农历信息
            addTail();

        }

        private void addDatesPanel() {
            datePanel.removeAll();
            parent.add(datePanel, BorderLayout.CENTER);

            datePanel.setLayout(new GridLayout(6, 7));

            if (week.y % 4 == 0 && week.y % 100 != 0)
                week.monthday[1] = 29; // 判断是否为闰年
            int index = 0;
            for (week.d = 1; week.d <= week.monthday[week.m - 1]; week.d++) {
                week.w = week.week(week.y, week.m, week.d); // 计算出这个月的开头是星期几
                // 根据已算出的其星期几,来输出每个月的一号前的几个空格以使星期与日期对齐
                if (week.d == 1) {
                    for (week.i = 0; week.i < week.w; week.i++) {
                        setLabelText(index, "  /t   ");
                        index++;

                    }

                }
                // 开始输出这个月的所有日期
                if (week.d <= 31) {/*
                                     * 注:这里的if条件week.d小于的数只要大于等于31就可以,因为到底输出多少天
                                     * 有第二层循环的”d<=week.monthday[week.m-1]“来决定
                                     */
                    if (week.d == c.get(Calendar.DAY_OF_MONTH)) {
                        setLabelText(index,
                                "<html><font color=red> &nbsp;&nbsp;&nbsp;"
                                        + week.d + "</font></html>    ");
                    } else {

                        setLabelText(index, "   " + week.d + "     ");
                    }

                    index++;
                }

            }

            for (; index < 6 * 7; index++) {
                setLabelText(index, "  /t  ");
            }

        }

        private void setLabelText(int index, String text) {

            days[index].setText(text);
            days[index].setName(week.d + "");

            days[index].setFont(f);
            int year = Integer.parseInt(yearField.getText().trim());
            int month = Integer.parseInt(monthField.getText().trim());
            Calendar cc = new GregorianCalendar(year, month - 1, week.d);
            String lunDate = new Lunar(cc).toString();
            days[index].setToolTipText(lunDate);
            datePanel.add(days[index]);

        }

        private void addWeeksLabels(JPanel p) {
            JPanel weeks = new JPanel();
            weeks.setBackground(Color.ORANGE);
            weeks.setLayout(new GridLayout());
            weeks.add(new JLabel("周七       "));
            weeks.add(new JLabel("周一    "));
            weeks.add(new JLabel("周二    "));
            weeks.add(new JLabel("周三    "));
            weeks.add(new JLabel("周四    "));
            weeks.add(new JLabel("周五    "));
            weeks.add(new JLabel("周六   "));

            p.add(weeks, BorderLayout.CENTER);
        }

        public void addInput(JPanel p) {
            JPanel inputPanel = new JPanel();
            inputPanel.setBackground(Color.YELLOW);
            inputPanel.setLayout(new GridLayout(1, 4));

            yearField = new JTextField(week.y + "");
            monthField = new JTextField(week.m + "");
            inputPanel.add(yearField);
            inputPanel.add(monthField);
            p.add(inputPanel, BorderLayout.NORTH);
        }

        private void addInputField() {
            JPanel par = new JPanel();
            parent.add(par);
            par.setLayout(new BorderLayout());

            addInput(par);
            addWeeksLabels(par);

        }

        public static void main(String[] args) {
            new Main();
        }

        private void modifyDatePanel() {
            addDatesPanel();
        }

        private void modifyModel() {

            week.y = Integer.parseInt(yearField.getText().trim());
            week.m = Integer.parseInt(monthField.getText().trim());

            c.set(Calendar.YEAR, week.y);
            c.set(Calendar.MONTH, week.m - 1);

            lunar.setCal(c);
        }

        private void monthAddOne() {
            if (week.m < 12) {
                week.m++;
            } else if (week.m == 12) {
                week.y++;
                week.m = 1;
            }
            c.set(Calendar.YEAR, week.y);
            c.set(Calendar.MONTH, week.m - 1);
            lunar.setCal(c);

        }

        private void monthMinusOne() {
            if (week.m == 1) {
                week.y--;
                week.m = 12;
            } else {
                week.m--;
            }
            c.set(Calendar.YEAR, week.y);
            c.set(Calendar.MONTH, week.m - 1);
            lunar.setCal(c);
        }

        private void addTail() {

            south.setLayout(new BorderLayout());
            parent.remove(south);
            parent.add(south, BorderLayout.SOUTH);

            addClock(south);

        }

        private void addClock(JPanel south) {
            south.remove(clock);
            south.add(clock, BorderLayout.CENTER);
        }

        public void mouseWheelMoved(MouseWheelEvent e) {

            if (e.getWheelRotation() == 1) {
                monthAddOne();
            } else if (e.getWheelRotation() == -1) {
                monthMinusOne();
            }

            yearField.setText(week.y + "");
            monthField.setText(week.m + "");

            modifyDatePanel();
            // addTail();
            // this.repaint();
            parent.repaint();

        }

        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == yearField || e.getSource() == monthField) {
                try {
                    modifyModel();
                    System.out.println("===========");
                    modifyDatePanel();

                } catch (NumberFormatException e1) {
                    JOptionPane.showMessageDialog(this, "日期格式不对!!!:"
                            + e1.getMessage());

                }

                parent.repaint();

            }

        }

    }

     

     

     

     

     

     

    //============================================

    /**
     * Clock.java
     * Summary 数字时间显示
     * @author liyuanxun
     *
     */

    /**
     * java.awt.Canvas:Canvas组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件。
     * java.awt.Font:Font类表示字体,用来以可见方式呈现文本。字体提供将字符序列映射到字形序列所需的信息,以便在Graphics对象和Component对象上呈现字形序列
     * java.awt.Graphics类是所有图形上下文的抽象基类,允许应用程序可以在组件(已经在各种设备上实现),以及闭屏图像上,进行绘制
     * java.text:提供以与自然语言无关的方式来处理文本,日期,数字和消息的类和接口
     * java.text.SimpleDateFormat:是一个以与语言环境相关的方式来格式化和分析日期的额具体类。
     */

    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;

    class Clock2 extends Canvas implements Runnable {
        /**
      *
      */

        private static final long serialVersionUID = 3660124045489727166L;

        Thread t;
        String time;
        Main frame;

        public Clock2(Main frame) {
            this.frame = frame;
            setSize(350, 100);
            setBackground(new Color(204, 232, 207));
            t = new Thread(this);
            t.start();
        }

        public void run() {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    System.out.println("异常");
                }
                this.repaint(100);
            }
        }

        public void paint(Graphics g) {
            Font f = new Font("宋体", Font.BOLD, 13);
            SimpleDateFormat SDF = new SimpleDateFormat(
                    "yyyy'年'MM'月'dd'日'  HH:mm:ss");
            Calendar now = Calendar.getInstance();
            time = SDF.format(now.getTime());
            g.setFont(f);
            g.setColor(Color.blue);
            String lunar = frame.lunar.toString();
            String shengxiao = frame.lunar.animalsYear();
            g.drawString(time, 20, 10);
            g.drawString("农历:", 20, 30);
            g.drawString(lunar, 60, 30);
            g.drawString("生肖:", 20, 50);
            g.drawString(shengxiao, 60, 50);

        }
    }

     

    //========================================================


    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;

    class Lunar {
        private int year;
        private int month;
        private int day;
        private boolean leap;
        final static String[] chineseNumber = { "一", "二", "三", "四", "五", "六", "七",
                "八", "九", "十", "十一", "十二" };
        static SimpleDateFormat chineseDateFormat = new SimpleDateFormat(
                "yyyy年MM月dd日");
        final static long[] lunarInfo = new long[] { 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, 0x0a5d0, 0x14573, 0x052d0, 0x0a9a8, 0x0e950,
                0x06aa0, 0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260,
                0x0f263, 0x0d950, 0x05b57, 0x056a0, 0x096d0, 0x04dd5, 0x04ad0,
                0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b5a0, 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, 0x04bd7, 0x04ad0, 0x0a4d0,
                0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, 0x0b5a0, 0x056d0, 0x055b2,
                0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0 };

        // ==========================传回农历y年的总天数
        final private static int yearDays(int y) {
            int i, sum = 348;
            for (i = 0x8000; i > 0x8; i >>= 1) {
                if ((lunarInfo[y - 1900] & i) != 0)
                    sum += 1;
            }
            return (sum + leapDays(y));
        }

        // ====== 传回农历 y年闰月的天数
        final private static int leapDays(int y) {
            if (leapMonth(y) != 0) {
                if ((lunarInfo[y - 1900] & 0x10000) != 0)
                    return 30;
                else
                    return 29;
            } else
                return 0;
        }

        // ====== 传回农历 y年闰哪个月 1-12 , 没闰传回 0
        final private static int leapMonth(int y) {
            return (int) (lunarInfo[y - 1900] & 0xf);
        }

        // ====== 传回农历 y年m月的总天数
        final private static int monthDays(int y, int m) {
            if ((lunarInfo[y - 1900] & (0x10000 >> m)) == 0)
                return 29;
            else
                return 30;
        }

        // ====== 传回农历 y年的生肖
        final public String animalsYear() {
            final String[] Animals = new String[] { "鼠", "牛", "虎", "兔", "龙", "蛇",
                    "马", "羊", "猴", "鸡", "狗", "猪" };
            return Animals[(year - 4) % 12];
        }

        // ====== 传入 月日的offset 传回干支, 0=甲子
        final private static String cyclicalm(int num) {
            final String[] Gan = new String[] { "甲", "乙", "丙", "丁", "戊", "己", "庚",
                    "辛", "壬", "癸" };
            final String[] Zhi = new String[] { "子", "丑", "寅", "卯", "辰", "巳", "午",
                    "未", "申", "酉", "戌", "亥" };
            return (Gan[num % 10] + Zhi[num % 12]);
        }

        // ====== 传入 offset 传回干支, 0=甲子
        final public String cyclical() {
            int num = year - 1900 + 36;
            return (cyclicalm(num));
        }

        /** */
        /**
         * 传出y年m月d日对应的农历. yearCyl3:农历年与1864的相差数 ? monCyl4:从1900年1月31日以来,闰月数
         * dayCyl5:与1900年1月31日相差的天数,再加40 ?
         *
         * @param cal
         * @return
         */
        public Lunar(Calendar cal) {
            setCal(cal);
        }

        public void setCal(Calendar cal) {
            @SuppressWarnings("unused")
            int yearCyl, monCyl, dayCyl;
            int leapMonth = 0;
            Date baseDate = null;
            try {
                baseDate = chineseDateFormat.parse("1900年1月31日");
            } catch (ParseException e) {
                e.printStackTrace(); // To change body of catch statement use
                                        // Options | File Templates.
            }

            // 求出和1900年1月31日相差的天数
            int offset = (int) ((cal.getTime().getTime() - baseDate.getTime()) / 86400000L);
            dayCyl = offset + 40;
            monCyl = 14;

            // 用offset减去每农历年的天数
            // 计算当天是农历第几天
            // i最终结果是农历的年份
            // offset是当年的第几天
            int iYear, daysOfYear = 0;
            for (iYear = 1900; iYear < 2050 && offset > 0; iYear++) {
                daysOfYear = yearDays(iYear);
                offset -= daysOfYear;
                monCyl += 12;
            }
            if (offset < 0) {
                offset += daysOfYear;
                iYear--;
                monCyl -= 12;
            }
            // 农历年份
            year = iYear;

            yearCyl = iYear - 1864;
            leapMonth = leapMonth(iYear); // 闰哪个月,1-12
            leap = false;

            // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
            int iMonth, daysOfMonth = 0;
            for (iMonth = 1; iMonth < 13 && offset > 0; iMonth++) {
                // 闰月
                if (leapMonth > 0 && iMonth == (leapMonth + 1) && !leap) {
                    --iMonth;
                    leap = true;
                    daysOfMonth = leapDays(year);
                } else
                    daysOfMonth = monthDays(year, iMonth);

                offset -= daysOfMonth;
                // 解除闰月
                if (leap && iMonth == (leapMonth + 1))
                    leap = false;
                if (!leap)
                    monCyl++;
            }
            // offset为0时,并且刚才计算的月份是闰月,要校正
            if (offset == 0 && leapMonth > 0 && iMonth == leapMonth + 1) {
                if (leap) {
                    leap = false;
                } else {
                    leap = true;
                    --iMonth;
                    --monCyl;
                }
            }
            // offset小于0时,也要校正
            if (offset < 0) {
                offset += daysOfMonth;
                --iMonth;
                --monCyl;
            }
            month = iMonth;
            day = offset + 1;
        }

        public static String getChinaDayString(int day) {
            String chineseTen[] = { "初", "十", "廿", "卅" };
            int n = day % 10 == 0 ? 9 : day % 10 - 1;
            if (day > 30)
                return "";
            if (day == 10)
                return "初十";
            else
                return chineseTen[day / 10] + chineseNumber[n];
        }

        public String toString() {
            return cyclical() + "年" + (leap ? "闰" : "") + chineseNumber[month - 1] + "月"
                    + getChinaDayString(day);
        }

        public static void main(String[] args) throws ParseException {
            Calendar today = Calendar.getInstance();
            today.setTime(chineseDateFormat.parse("2003年1月1日"));
            Lunar lunar = new Lunar(today);

            System.out.println("北京时间:" + chineseDateFormat.format(today.getTime())
                    + " 农历" + lunar);
        }

    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    import java.util.Calendar;

    //计算星期的函数

    /*
     * 万年历的公式常用公式: S=X-1+(X-1)/4-(X-1)/100+(X-1)/400+C 说明:X为公元年数;
     * C为从元旦起,到要算的那天总天数(如:2003年2月13日,C=31+13=44)
     * S/7余数为星期几(如余数为0,1,2,3,4,5,6。分别为星期天,星期一,二,三,四,五,六)
     *
     * 基姆拉尔森计算公式: 在公式中d表示日期中的日数,m表示月份数,y表示年数。 注意:在公式中有个与其他公式不同的地方:
     * 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13- 10来代入公式计算。
     */
    // 用于计算某一日期为星期几
    class Week {
        int monthday[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
        int y, w, i, m = 1, d = 1; // y为年、m为月、d为日期、w为星期几

        public Week() {

        }

        public Week(Calendar c) {
            y=c.get(Calendar.YEAR);
            m=c.get(Calendar.MONDAY)+1;
        //    d=c.get(Calendar.DAY_OF_MONTH);

        }

        int week(int y, int m, int d) {
            int w;
            if ((m == 1) || (m == 2)) {
                y--;
                m += 12;
            }
            w = (d + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400 + 1) % 7; /* 基姆拉尔森计算公式 */
            return (w);
        }
    }

     

     

    展开全文
  • 这学期学了java,里面的图形用户界面方面的内容学习时,由于之前接触过Flash的AS3.0语言,对组件、监听、事件等上手比较快,在这一方面两者较为类似,需要多注意的是布局的学习应用。最后的结果是做了一个万年历,...

    
    

    这学期学了java,里面的图形用户界面方面的内容学习时,由于之前接触过Flash的AS3.0语言,对组件、监听、事件等上手比较快,在这一方面两者较为类似,需要多注意的是布局的学习应用。最后的结果是做了一个万年历,结果图如下:

                                                                   

    看似简单的界面还是有不少深坑的。

    这个万年历采用复杂网格布局(GridBagLayout),主要分为三个部分:

    1.初始化方法。要实现第一次进入万年历时默认显示2017年1月,随后调用时部分组件不用重复布局(后面会讲为什么要调用初始化方法)。

    2.响应事件。这个小程序一共安放了4个监听,分别加在“上月”、“下月”和两个年月值文本框(回车触发事件,用ActionEvent,非ItemEvent)。

    3.星期的计算函数。获取年月值后,计算当月1号是星期几。


    其中第三部分最容易理解,只要足够仔细,用getText获得年月值后,计算该年该月1号距离公元1 年1月1号(星期一)有多少天,对7取余不难得出结果。重点在于前两部分的设计和调试。


    为了叙述方便,在下文中我把每次翻月会改变的部分命名为A区域,即图中的日期值阿拉伯数字部分。

    显然,对于这个万年历,触发监听事件后需要更改的组件都是在A区域内,每次翻页只需要改变A区域即可。


    所以得出了一个很自然的设想:触发事件监听时,remove出所有日期值,再依次放入新的月份值的各个日期。即:

    监听翻页——>setText方法改变文本框的年月值——>remove掉A区域的组件——>获取年月值,自定义方法得到该月1号是星期几——>将“1”放到对应位置,后续依次排列

    因为初始化方法init()只写一个比较好,我尝试过在上述第五步的时候用新的初始化方法init_2(),但一没必要,二容易出错。只需要在一开始定义一个flag=0,完成初始的全部布局后flag=1,再加上合适的判断语句不难做到第五步调用初始化方法时只执行部分语句。

    在此先注意到remove(int index)方法,该方法需要一个参数,为组件的序号,组件序好取决于其放入的先后,如第3个放入的组件的序号是3,remove某一个组件后,序号在其后的组件的序号都会前移。所以在该程序中,只需要不断执行remove()若干次即可(得保证日期数字是最后放入的组件)。

    随后完成初步调试后发现,上述步骤都能执行,但是点击翻页后,remove成功了,但新加入的组件未显示,但加入检测语句却发现初始化方法是正常调用的。到这里我认为是重新调用add语句将组件放入这种语句不正确。直到我偶然中拖动了一下边框改变了程序框的大小,发现这时新加入的A区域能正常显示了,但A区域外的组件变回了默认的边界布局(A区域仍然是复杂网格布局),备份问价在我完成后删了,所以具体的错误界面请各位脑补吧= =、。


    由此引出了本次万年历设计过程中最大的两个问题:

    1.为什么新加入组件需要拖动改变外框大小才能得以显示?

    2.为什么调用一次初始化方法后,没对A区域外的组件干什么,但它们的原有布局会被破坏?


    对于上述两个问题,我在查阅相关资料,问了一些同学之后找到了解决办法。

    首先对于问题1:在完成组件的更换之后,Java要求界面得更新一下才能显示新的组件,我一开始使用的是repaint方法,但实际上这里要用的是validata方法。在监听方法调用初始化方法后加一句validata()就能解决这个问题。

    至于问题2,则是一开始的布局方法使用就有问题。我采用的是复杂网格布局,依次创建GridBagLayout和GridBagConstraints的类对象,并设置相关参数后,我原先是直接使用add(XX);这样的确可以放入,我查阅的书籍上样例也是如此,但这样会导致上文所说的错误。因为书籍的该部分讲的是复杂网格布局的应用样例,所以对于万年历这样的具体项目需要多想一层。解决办法也很简单,新建一个Panel:panel,将所有的组件放到panel内而不是直接进行布局,后面语句也应该用panel.add();这样一来,所有的组件均在panel内布局,此时A区域外的组件在重新调用初始化方法后布局不会被破坏,问题解决。

    新的布局方法片段:

    		GridBagLayout cal = new GridBagLayout();
    		GridBagConstraints cals = new GridBagConstraints();
    		setLayout(cal);
    		panel.setLayout(cal);
    		add(panel);
    		//“上月”按钮
    		cals.gridx = 1;
    		cals.gridy = 1;
    		cals.gridwidth = 2;
        	cals.gridheight = 7;
    		cal.setConstraints(last,cals);
    		panel.add(last,cals);
    		last.addActionListener(this);

    回看整个项目,其实主要问题就是这两个,一味的模仿书上的样例而不具体结合需求进行编写的话,迟早会遇到问题。而且在分析问题解决问题中学到的才是真正的本领。上面两点对于我们来说尤为重要。


    展开全文
  • (1)使用图形用户界面来查询用户所需的日期信息,符合日常软件使用规范。 (2)按月份查询,实现了显示查询1901~2100年某月所有日期的阴阳历对照。 (3)并且添加了许多节日与星座等信息,界面采用日常的星期与月份...
  • import java.io.InputStreamReader; public class Work1 { // 判断字符串是否为数字 private static boolean isNumeric(String str) { // TODO Auto-generated method stub boolean flag = false; for(int i...

    问题

    在控制台输入一个年份和月份,在控制台输出这个月的日历。

    基本思路

    先计算某年某月的第一天距离1900.1.1的天数。然后用天数%7,就可以得到这一天是星期几。然后对这个月进行遍历存储在二维数组中。

    日期类

    package day06;
    
    public class Date {
    	private int year;
    	private int month;
    	
    	public Date(int year,int month) {
    		this.year = year;
    		this.month = month;
    	}
    	public Date() {
    		
    	}
    	public int setYear(int yesr	) {
    		return this.year = yesr;
    	}
    	public int setMonth(int month) {
    		return this.month = month;
    	}
    //	计算xx年xx月距离1900.1.1有多少天
    	public int  getDays() {
    		int days = 0;
    		for(int i = 1900; i<year;i++) {
    			if(i%4==0&&i%100!=0||i%400==0) {
    				days = days +366;
    			}
    			else {
    				days = days +365;
    			}
    		}
    		for(int i = 1;i<month;i++) {
    			days = days +this.getMonthDays(i);
    		}
    		return days+1;
    	}
    //	计算月份的天数
    	public int getMonthDays(int month) {
    		int monthDays = 0;
    		if(month==2) {
    			if(year%4==0&&year%100!=0||year%400==0) {
    				monthDays = monthDays+29;
    			}
    			else {
    				monthDays = monthDays+28;
    			}
    		}else if(month==4||month==6||month==9||month==11) {
    			monthDays = monthDays+30;
    		}else {
    			monthDays = monthDays+31;
    		}
    		return monthDays;
    	}
    //	将某月的日历放在二维数组中
    	public String[][] getRiLi() {
    		String[][] riLi = new String[7][7];
    		Integer m = 1;
    		riLi[0][0] = "\t日";	riLi[0][1]= "\t一";	riLi[0][2] = "\t二";
    		riLi[0][3] = "\t三";	riLi[0][4] = "\t四";	riLi[0][5] = "\t五";
    		riLi[0][6] = "\t六";
    		for(int j= 0;j<this.getDays()%7;j++) {
    			riLi[1][j] = "\t";
    		}
    		for(int j= this.getDays()%7;j<7;j++) {
    			riLi[1][j] ="\t"+m.toString();
    			m++;
    		}
    		for(int i = 2; i<7;i++) {
    			for(int j = 0;j<7;j++,m++) {
    				if(m>this.getMonthDays(month)) {
    					riLi[i][j] ="\t";
    				}
    				else {
    					riLi[i][j] ="\t"+m.toString();
    				}
    			}
    			
    		}
    		return riLi;
    	}
    
    
    }
    
    

    用户进行交互的控制台代码

    package day06;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    public class Work1 {
    //	判断字符串是否为数字
    	private static boolean isNumeric(String str) {
    		// TODO Auto-generated method stub
    		boolean flag = false;
    		for(int i =0 ; i<str.length();i++) {
    			char ch = str.charAt(i);
    			if (ch == '0' || ch == '1' || ch == '2' || ch == '3' || ch == '4' || ch == '5' || ch == '6' || ch == '7'
    					|| ch == '8' || ch == '9') {
    				flag = true;
    			} else {
    				flag = false;
    				break;
    			}
    		}
    		return flag;
    	}
    	public static void main(String[] args) {
    		Date d1 = new Date();
    		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    		while (true) {
    			System.out.println("请输入要查询的年份月份或者输入退出结束程序。");
    			String str = null;
    			try {
    				str = in.readLine();
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    			String[] s = str.split(" ");
    			if (isNumeric(str)) {
    				Integer year = Integer.parseInt(s[0]);
    				Integer month = Integer.parseInt(s[1]);
    				if ((year > 1900) && (month >= 1 && month <= 12)) {
    					d1.setYear(year);
    					d1.setMonth(month);
    					String[][] rili = d1.getRiLi();
    					for (String[] k : rili) {
    						for (String v : k) {
    							System.out.print(v);
    						}
    						System.out.println();
    					}
    				} else {
    					System.out.print("输入错误");
    				}
    			} else if (str.equals("退出")) {
    				System.out.println("程序结束");
    				break;
    			} else {
    				System.out.println("输入错误");
    			}
    
    		}
    	}
    
    }
    
    
    展开全文
  • 简单JAVA语言编写的万年历系统源码 直接就是Eclipse 工程 直接用 完美中文注释 适合刚入门JAVA程序员
  • java万年历实现

    2012-08-05 20:04:47
    import java.util.*; public class calendar { public static void main(String[] args) { System.out.println("**************欢迎使用万年历************"); int year = 0; int month = 0...

     

    import java.util.*;
    
    public class calendar {
    	public static void main(String[] args) {
    		System.out.println("**************欢迎使用万年历************");
    		int year = 0;
    		int month = 0;
    		int day = 0; // 所输入年份的月份天数;
    		int sumdays = 0;// 总天数
    		int yearday = 0; // 所输入年到1990年1月1日的天数
    		int monthday = 0; // 所输入月到所输的年1月1日的天数
    		int week = 0;// 该月第一天是星期几
    		int weekday = 0;// 当天是星期几
    		String answer;
    		do {
    			// 请用户输入要查询的年份 和月份
    			// ----------循环后更新数据
    			Scanner input = new Scanner(System.in);
    			System.out.print("请输入年份:");
    			year = input.nextInt();
    			System.out.print("请输入月份:");
    			month = input.nextInt();
    
    			// 判断该年是否是闰年
    			boolean isRn = year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
    
    			if (month == 1 || month == 3 || month == 5 || month == 7
    					|| month == 8 || month == 10 || month == 12) {
    				day = 31;
    			} else if (month == 4 || month == 6 || month == 9 || month == 11) {
    				day = 30;
    			} else if (month == 2 && isRn == true) {
    				day = 29;
    			} else {
    				day = 28;
    			}
    
    			// 计算该月第一天是星期几
    			// 计算所输入年1月1日到1900年1月1日的总天数
    
    			for (int i = 1900; i < year; i++) {
    				if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0) {
    					yearday = yearday + 366;
    				} else {
    					yearday = yearday + 365;
    				}
    			}
    			// 计算所输入月份 到 所输入年份1月1号的天数
    			for (int n = 1; n < month; n++) {
    				if (n == 1 || n == 3 || n == 5 || n == 7 || n == 8 || n == 10
    						|| n == 12) {
    					monthday = monthday + 31;
    				} else if (n == 4 || n == 6 || n == 9 || n == 11) {
    					monthday = monthday + 30;
    				} else if (n == 2 && isRn == true) {
    					monthday = monthday + 29;
    				} else {
    					monthday = monthday + 28;
    				}
    			}
    
    			// 计算总天数
    			sumdays = yearday + monthday;
    			// 计算该月第一天是星期几
    			week = 1 + sumdays % 7;
    			// 打印月历
    			System.out.println("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六");
    
    			// 打印第一行空格
    			if (week != 7) { // 判断第一天是否是星期日 如果是 不打印空格
    				for (int j = 0; j < week; j++) {
    					System.out.print("\t");
    				}
    			}
    			for (int k = 1; k <= day; k++) {
    				weekday = (sumdays - 1 + k) % 7 + 1; // 计算当月每日是星期几
    				if (weekday == 6) { // 判断当日 是否是星期六
    					System.out.print(k + "\n");
    				} else {
    					System.out.print(k + "\t");
    				}
    			}
    			System.out.print("\n\n是否继续(y/n):");
    			answer = input.next();
    		} while (answer.equals("y"));
    
    	}
    
    }
    我的话费充值店-各种面额
    电信100元仅售98.60 
    联通100仅售99.00 移动100仅售99.30

     

    展开全文
  • 2013-2014学年第二学 学号 面向对象程序设计 课程设计报告 万年历系统题目 专业计算机科学与技术 级 班 姓名 号学 教导指 师 绩成 计算机与信息工程系 日6月6年2014 目录 1设计内容及要求 设计内容 万年历实际上就是...
  • #Java利用Calendar自制的万年历(含图形化界面) package MyDate; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import javax.swing.BorderFactory; import javax....
  • Java万年历源代码,可显示公历、农历、系统时间、国际时间,直接可以运行
  • 万年历 JAVA编写

    2011-04-05 21:48:16
    能实现万年历的基本功能,有图形用户界面设计,对初学者很有用处
  • 1.需求:打印图形 * ** *** **** ***** for(int i = 0;i<5;i++){ for(int j = 0;j<=i;j++){ System.out.print("*"); } System.out.println(); } *****...
  • java 实现万年历

    2017-04-14 15:31:00
    曾经初学java万年历,都是採用主要的算法求出是否闰年闰月 计算公式例如以下 int year = 2014, month = 8, total = 0; if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month ...
  • javaSwing万年历小程序

    2018-05-20 15:00:14
    通过图形界面来显示万年历程序。能以月历形式显示日期与星期,支持用户自己输入年份,并提供月份的下拉组合框来选择月份,通过点击更新来刷新日历 具体年份从1900年到2100年甚至更多

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 292
精华内容 116
关键字:

java万年历图形

java 订阅