java 日历软件

         要求: 综合运用GUI编程、事件处理、Calendar类应用等知识设计一款月历,要求能通过输入(或选择)年月的方式正确显示当前月份的所有日期。

 

效果图如下:

b9d25532851848a1a3027f924d0e02f6.png

 

 

 

完整代码如下:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Timer;

class mouthpass_Exception extends Exception{
  public mouthpass_Exception(){}
public mouthpass_Exception (String message){
      super(message);
}
public String mess(){
      return "输入异常";
}
}//自定义异常类


class myCal extends JFrame {
    Calendar times = Calendar.getInstance();
    private JPanel p1, p2, p3;
    private JLabel text, year, month;
    private  static JLabel nowdays;
    private JTextField y;
    int yearSet = times.get(Calendar.YEAR);
    private JTextField m;
    int monthSet = times.get(Calendar.MONTH) + 1;
    private JButton sure, front, next;
    private JDialog  JDtextl;


    //p2
    private String[] week = {"  周日", "  周一", "  周二", "  周三", "  周四", "  周五", "  周六"};
    private JButton[] weekbutton = new JButton[week.length];
    //p3
    private JButton[] day = new JButton[42];


    public myCal() {

        //获取现在的时间
        times.setTime(new Date());
        String years = String.valueOf(times.get(Calendar.YEAR)),
                months = String.valueOf(times.get(Calendar.MONTH) + 1);


        p1 = new JPanel();
        p2 = new JPanel();
        p3 = new JPanel();
        JDtextl=new JDialog();

        text = new JLabel("请输入日期:");
        year = new JLabel("年份");
        month = new JLabel("月份");
        nowdays = new  JLabel(String.valueOf(times.getTime()));
        y = new JTextField(years, 4);
        m = new JTextField(months, 4);
        sure = new JButton("确定");
        front = new JButton("<");
        next = new JButton(">");

    }

    public void init() {//初始化
        this.setTitle("日历");
        this.setLocationRelativeTo(null);
        ;
        this.setResizable(false);


        this.setBounds(200, 200, 600, 270);


        this.setLayout(new BorderLayout());
        this.add(p1, BorderLayout.NORTH);
        this.add(p2, BorderLayout.CENTER);
        this.add(p3, BorderLayout.SOUTH);

        p1.setLayout(new FlowLayout());
        p1.add(text);
        p1.add(year);
        p1.add(y);
        p1.add(month);
        p1.add(m);
        p1.add(sure);
        sure.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {get_text();
                    setDay(yearSet, monthSet);}catch(mouthpass_Exception u){
                    JDtextl.setTitle("提示");
                    JLabel t=new JLabel("月份输入异常");
                    JDtextl.add(t);
                    JDtextl.setLocationRelativeTo(null);
                    JDtextl.setSize(90,80);
                    t.setSize(70,70);
                    JDtextl.setVisible(true);

                }
                setDay(yearSet, monthSet);

                if((times.get(Calendar.YEAR)==Integer.parseInt(y.getText()))&&(times.get(Calendar.MONTH)+1)==Integer.parseInt(m.getText())) {
                    GregorianCalendar dateSet = new GregorianCalendar(yearSet, monthSet - 1, 1);
                    int weeknum = dateSet.get(Calendar.DAY_OF_WEEK);
                    int I = weeknum - 2 + times.get(Calendar.DAY_OF_MONTH);
                    day[I].setForeground(Color.RED);
                    day[I].setBackground(Color.ORANGE);
                }

            }
        });

        p1.add(front);//上一个月
        front.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {get_text();
                    setDay(yearSet, monthSet);}catch(mouthpass_Exception u){
                    JDtextl.setTitle("提示");
                    JLabel t=new JLabel("月份输入异常");
                    JDtextl.add(t);
                    JDtextl.setLocationRelativeTo(null);
                    JDtextl.setSize(90,80);
                    t.setSize(70,70);
                    JDtextl.setVisible(true);

                }
                if (monthSet == 1) {
                    yearSet = yearSet - 1;
                    monthSet = 12;
                    setDay(yearSet, monthSet);
                } else {
                    monthSet = monthSet - 1;
                    setDay(yearSet, monthSet);
                }
                y.setText(Integer.toString(yearSet));
                m.setText(Integer.toString(monthSet));
                setDay(yearSet, monthSet);



            }
        });

        p1.add(next);//下一个月
        next.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                try {get_text();
                    setDay(yearSet, monthSet);} catch(mouthpass_Exception u){
                    JDtextl.setTitle("提示");
                    JLabel t=new JLabel("月份输入异常");
                    JDtextl.add(t);
                    JDtextl.setLocationRelativeTo(null);
                    JDtextl.setSize(90,80);
                    t.setSize(70,70);
                    JDtextl.setVisible(true);

                }
                if (monthSet == 12) {
                    yearSet = yearSet + 1;
                    monthSet = 1;
                    setDay(yearSet, monthSet);


                } else {
                    monthSet = monthSet + 1;
                    setDay(yearSet, monthSet);

                }
                y.setText(Integer.toString(yearSet));
                m.setText(Integer.toString(monthSet));
                setDay(yearSet, monthSet);


            }
        });
        p1.add(nowdays);


        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });//关闭

        //p2
        p2.setLayout(new GridLayout(1, 7, 2, 3));
        for (int i = 0; i < week.length; i++) {
            weekbutton[i] = new JButton(week[i]);
            weekbutton[i].setBackground(Color.LIGHT_GRAY);
            p2.add(weekbutton[i]);
        }
        weekbutton[0].setBackground(Color.red);
        weekbutton[6].setBackground(Color.red);

        //p3
        p3.setLayout(new GridLayout(6, 7, 2, 3));
        for (int i = 0; i < 42; i++) {
            day[i] = new JButton(i + " ");
            p3.add(day[i]);

        }
        try {get_text();
            setDay(yearSet, monthSet);}catch(mouthpass_Exception u){
            JDtextl.setTitle("提示");
            JLabel t=new JLabel("月份输入异常");
            JDtextl.add(t);
            JDtextl.setLocationRelativeTo(null);
            JDtextl.setSize(90,80);
            t.setSize(70,70);
            JDtextl.setVisible(true);

        }
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public void get_text() throws mouthpass_Exception {
        monthSet = Integer.parseInt(m.getText());
        if (monthSet > 12 || monthSet < 1) {
            throw new mouthpass_Exception("月份错误");
        }
        yearSet = Integer.parseInt(y.getText());




    }//获得文本框的信息

    private void setDay(int yearSet, int monthSet) {

        GregorianCalendar dateSet = new GregorianCalendar(yearSet, monthSet - 1, 1);
        int weeknum = dateSet.get(Calendar.DAY_OF_WEEK);
        boolean isleap = dateSet.isLeapYear(yearSet);

        int mouthDays = getMouthDays(monthSet, isleap);
        int mouthDaysFront=getMouthDays(monthSet-1,isleap);




      //上个月剩余
       for(int i=0,count=mouthDaysFront-weeknum+2;i<weeknum-1;i++,count++){
           day[i].setText(Integer.toString(count));
           day[i].setBackground(Color.GRAY);
           day[i].setForeground(Color.BLACK);
       }
       //下个月
        for(int i=mouthDays+weeknum-1,count=1;i<42;i++,count++){
            day[i].setText(Integer.toString(count));
            day[i].setBackground(Color.GRAY);
            day[i].setForeground(Color.BLACK);

        }

        for (int i = weeknum - 1, count = 1; count <= mouthDays; i++, count++) {
            day[i].setText(Integer.toString(count));
            day[i].setBackground(Color.white);
            day[i].setForeground(Color.BLACK);

        }
        if((times.get(Calendar.YEAR)==Integer.parseInt(y.getText()))&&(times.get(Calendar.MONTH)+1)==Integer.parseInt(m.getText())) {
            int I = weeknum - 2 + times.get(Calendar.DAY_OF_MONTH);
            day[I].setForeground(Color.RED);
            day[I].setBackground(Color.ORANGE);
        }
        if((times.get(Calendar.YEAR)==Integer.parseInt(y.getText()))&&(times.get(Calendar.MONTH)+1)==Integer.parseInt(m.getText())) {
            int I = weeknum - 2 + times.get(Calendar.DAY_OF_MONTH);
            day[I].setForeground(Color.RED);
            day[I].setBackground(Color.ORANGE);
        }

    }//设置每天的方法

    public int getMouthDays(int month, boolean isleap) {
        int days = 0;
        if (isleap) {//润
            if (month == 2)
                return 28;
            else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
                return 31;
            else
                return 30;
        } else {//
            if (month == 2)
                return 29;
            else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
                return 31;
            else
                return 30;
        }
    }//判断月的天数
    public static void updateTime() {
       Timer timer = new Timer(true);//关联的线程作为守护进程运行,则为true。
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                nowdays.setText(df.format(new Date().getTime()));
            }
        }, 0, 1000);

    }//更新时间

}


public class myCalendar {

    public static void main(String[] args) {

        myCal Calendar1 = new myCal();

            Calendar1.init();
            myCal.updateTime();

    }
}

 

 

 

 

  • 2
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Java课程设计实训大作业:记事本+简易计算器+聊天系统+日历+中英查询 基础任务一:设计日历软件 根据如下图,综合运用GUI编程、事件处理、Calendar类应用等知识设计一款月历,要求能通过输入(或选择)年月的方式正确显示当前月份的所有日期。 基础任务二:设计中英查询软件 根据Java面向对象程序设计相关理论,及GUI编程、事件处理、数据库编程等技术,设计一个如下图所示的“中英文释义查询”程序。输入英文单词,查询数据库将对应的中文显示在下框中;输入中文,查询数据库将对应的英文单词显示在下框中。 提升任务三:设计简易记事本软件 1.使用Java图形界面组件设计记事本软件的界面,参考如图所示。 2.程序代码规范,逻辑正确,能够正常运行。 3.“文件”菜单,包括“新建”、“打开”、“保存”、“另存为”和“退出”等功能。 提升任务四:设计简易计算器软件 1.使用Java图形界面组件设计软件,界面如图所示。 2.软件能够满足基本的“加、减、乘、除”等运算要求。 3.程序代码清晰,语法规范,结构合理,逻辑正确。 进阶任务五:自选主题开发一个应用软件(如在线聊天系统,学籍管理系统等)下面给的软件界面只是参考,同学们可以根据自己的想法进行设计。 1.软件界面美观、功能完善软件,导航清晰,操作方便,使用菜单栏、工具栏、布局管理器、按钮、表格等多种Java图形界面组件。 2.程序代码清晰,语法规范,结构合理,逻辑正确。 3.功能完善,程序代码优化,执行效率高,具有较好可维护性和可扩展性。 4.软件功能设计具有一定的难度和创意。
以下是一个简单的Java日历软件设计的示例: ```java import java.util.Scanner; public class CalendarSoftware { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入年份和月份 System.out.print("请输入年份:"); int year = scanner.nextInt(); System.out.print("请输入月份:"); int month = scanner.nextInt(); // 检查年份和月份的有效性 if (year < 1900 || month < 1 || month > 12) { System.out.println("输入的年份或月份无效!"); return; } // 调用日历生成方法 generateCalendar(year, month); } public static void generateCalendar(int year, int month) { // 输出日历标题 System.out.println("日\t一\t二\t三\t四\t五\t六"); // 计算该月第一天是星期几 int firstDayOfWeek = getFirstDayOfWeek(year, month); // 计算该月的天数 int daysInMonth = getDaysInMonth(year, month); // 输出日历内容 for (int i = 0; i < firstDayOfWeek; i++) { System.out.print("\t"); } for (int i = 1; i <= daysInMonth; i++) { System.out.print(i + "\t"); if ((firstDayOfWeek + i) % 7 == 0) { System.out.println(); } } } public static int getFirstDayOfWeek(int year, int month) { // 根据公式计算星期几 int q = 1; int m = month; int K = year % 100; int J = year / 100; int h = (q + 13 * (m + 1) / 5 + K + K / 4 + J / 4 + 5 * J) % 7; int dayOfWeek = (h + 5) % 7; // 转换为星期天为第一天的格式 return (dayOfWeek + 6) % 7; } public static int getDaysInMonth(int year, int month) { // 判断是否为闰年 boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); // 根据月份返回天数 switch (month) { case 2: return isLeapYear ? 29 : 28; case 4: case 6: case 9: case 11: return 30; default: return 31; } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值