利用Java的swing+awt+util.Calendar编写一个可跳转至指定日期的万年历

一、引言
在前一篇文章我i已经提到了,转到研发部门以后,经理让我做一个万年历和时钟。
时钟文章的链接在这里:https://blog.csdn.net/weixin_46419890/article/details/124242427
下面将给大家分享,万年历的程序代码
二、正文
项目结构如图所示:
在这里插入图片描述
干货:

package Calendar;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Calendar;

public class PerCalendar {
    public  static void menu(JFrame jf,String ss,int year,int month,int day){
        if(month>=1&&month<=12){

        }else{
            month=12;
        }
        //获取当前的窗口主体
        Container ctainer=jf.getContentPane();
        //采用流式布局
        ctainer.setLayout(new FlowLayout());
        //设置‘年’字
        JLabel field_year=new JLabel("年");
        //设置与之对应的输入框
        JTextField field1=new JTextField();
        //限制输入的位数
        field1.setColumns(4);
        //设置‘月’字
        JLabel field_month=new JLabel("月");
        //设置与之对应的输入框
        JTextField field2=new JTextField();
        //限制输入的位数
        field2.setColumns(2);
        //设置‘日’字
        JLabel field_day=new JLabel("日");
        //设置与之对应的输入框
        JTextField field3=new JTextField();
        //限制输入的位数
        field3.setColumns(2);
        //设置一个跳转按钮
        JButton button=new JButton("跳转");
        //将以上组件装进窗口中
        ctainer.add(field1);
        ctainer.add(field_year);
        ctainer.add(field2);
        ctainer.add(field_month);
        ctainer.add(field3);
        ctainer.add(field_day);
        ctainer.add(button);
        //创建一个文本域
        JTextArea list=new JTextArea();
        //设置文本标题
        list.setBorder(BorderFactory.createTitledBorder(year+"年"+month+"月"+day+"日"));
        //将文本域添加进窗口
        jf.add(list);
        //设置文本域大小
        list.setBounds(10,10,550,300);
        //设置文本域内容
        list.setText(ss);
        list.setEditable(false);
        //以下三个addKeyListener分别对年月日的三个输入框进行了限制,限制其只能输入数字。
        field1.addKeyListener(new KeyAdapter() {
            @Override

            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                int keychar=e.getKeyChar();
                if(keychar>=KeyEvent.VK_0&&keychar<=KeyEvent.VK_9){

                }else{
                    e.consume();
                }
            }
        });
        field2.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                int keychar=e.getKeyChar();
                if(keychar>=KeyEvent.VK_0&&keychar<=KeyEvent.VK_9){

                }else{
                    e.consume();
                }
            }
        });
        field3.addKeyListener(new KeyAdapter() {
            @Override
            public void keyTyped(KeyEvent e) {
                super.keyTyped(e);
                int keychar=e.getKeyChar();
                if(keychar>=KeyEvent.VK_0&&keychar<=KeyEvent.VK_9){

                }else{
                    e.consume();
                }
            }
        });
        //为提交按钮绑定刷新事件
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Calendar calendar=Calendar.getInstance();
                //给年月日一个初始化数值
                int year=calendar.get(Calendar.YEAR);
                int month=calendar.get(Calendar.MONTH)+1;
                int day=calendar.get(Calendar.DATE);
                if(field1.getText().isEmpty()){

                }else{
                    //获得输入框输入的年份
                    year= Integer.parseInt(field1.getText());
                }
                if(field2.getText().isEmpty()){

                }else{
                    //获得输入框输入的月份
                    month= Integer.parseInt(field2.getText());
                }
                if(field3.getText().isEmpty()){

                }else{
                    //获得输入框输入的天
                    day= Integer.parseInt(field3.getText());
                }
                String S=date(year,month,day);
                jf.getContentPane().removeAll();
                menu(jf, ss, year, month, day);
            }
        });
    }
    public  static String date(int year,int month,int day){
        //判断输入的日是否合法
        if(day>=1&&day<=31){

        }else{
            //如果不合法,则看其月份,如果为2月,则修改其日为28号,其他月份则修改日为30,避免后台发生错误.
            if(month==2){
                day=28;
            }else {
                day=30;
            }
        }
        Calendar calendar=Calendar.getInstance();
        calendar.set(year,month-1,1);
        //获取第一天的星期
        int firstDay=calendar.get(Calendar.DAY_OF_WEEK);
        //将月份设置改为输入月份的下个月
        calendar.set(year,month,1);
        //将天数减一,就跳转到了输入月份的最后一天
        calendar.add(Calendar.DAY_OF_MONTH,-1);
        //获取这个月的总天数
        int days=calendar.get(Calendar.DAY_OF_MONTH);
        //创建一个StringBuilder,来对文本进行存储
        StringBuilder ss= new StringBuilder();
        //打印日历的表头
        ss.append("星期日\t星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t");
        //文本换行
        ss.append("\n");
        //输入日期
        int count=0;
        for(int i = 1;i<firstDay-1;i++){
            ss.append("\t");
            count++;
        }
        for(int i =1;i<=days;i++){
            //为了使得日期能够对其,当天数大于9以后,则变成2位数,将其进行对齐
            if(i<10){
                if(i==day){
                    //将跳转日期进行特殊‘*’标记,方便辨别
                    ss.append(" " + "*").append(i).append("\t");
                }else {
                    ss.append(" ").append(i).append("\t");
                }
            }else {
                if(i==day){
                    //将跳转日期进行特殊‘*’标记,方便辨别
                    ss.append("*").append(i).append("\t");
                }else {
                    ss.append(+i).append("\t");
                }
            }
            count++;
            //如果够一个星期,进行换行
            if(count%7==0){
                ss.append("\n");
            }
        }
        return ss.toString();
    }
    public static void main(String[] args){
        Calendar calendar =Calendar.getInstance();
        //获取当前日期的年月日
        int year= calendar.get(Calendar.YEAR);
        //因为获取到的月份比实际少一,每年的一月对应数字为0,则进行+1处理
        int month=calendar.get(Calendar.MONTH)+1;
        int day=calendar.get(Calendar.DATE);
        String s=date(year,month,day);
        JFrame jf=new JFrame();
        jf.setLayout(null);
        //设置大小为700*300
        jf.setSize(700,300);
        jf.setVisible(true);
        //为关闭窗口的关闭绑定事件
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        menu(jf,s,year,month,day);
    }
}


附上实现效果图:
在这里插入图片描述
Github项目地址:https://github.com/ZhuMengMeng666/ClockAndCalendar
三、提醒
平时不努力,加班徒伤悲😭
我只是一只擅长搬运的猪萌萌🤔

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猪萌萌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值