讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java中如何开发简易电子日历_电子日历项目实战解析

云芳同学_3596

云芳同学_3596

发布时间:2025-11-21 11:52:30

|

377人浏览过

|

来源于php中文网

原创

项目目标是开发支持显示年月日历、计算每月第一天星期几、切换月份和高亮当前日期的简易电子日历,使用Java标准库实现。2. 核心逻辑利用java.time.YearMonth和DayOfWeek计算某月第一天的星期和当月天数。3. 控制台版通过字符表格打印日历,先输出标题和星期标签,再按行填充日期,空位补空格,每行7天对齐显示。

在java中如何开发简易电子日历_电子日历项目实战解析

开发一个简易电子日历是Java初学者巩固面向对象编程、日期处理和图形界面设计的绝佳项目。本文将带你一步步实现一个基础但功能完整的电子日历,涵盖核心逻辑与界面展示。

1. 项目目标与功能设计

本电子日历支持以下基本功能:

  • 显示指定年月的日历视图
  • 自动计算每月第一天是星期几
  • 支持通过控制台或图形界面切换月份
  • 高亮当前日期

项目采用Java标准库,无需引入第三方依赖,适合学习使用。

2. 核心日期逻辑实现

关键在于准确计算某个月的第一天是星期几,并输出对应的日历布局。Java中可使用java.time.YearMonth和java.time.DayOfWeek来处理日期。

立即学习“Java免费学习笔记(深入)”;

示例代码:获取某月第一天的星期

import java.time.*;

public class CalendarUtils {
    public static int getFirstDayOfWeek(int year, int month) {
        YearMonth yearMonth = YearMonth.of(year, month);
        DayOfWeek dayOfWeek = yearMonth.atDay(1).getDayOfWeek();
        return dayOfWeek.getValue() % 7; // 返回 0=周日, 1=周一, ..., 6=周六
    }

    public static int getDaysInMonth(int year, int month) {
        return YearMonth.of(year, month).lengthOfMonth();
    }
}
  

3. 日历界面打印(控制台版)

使用字符画形式在控制台输出日历表格,便于调试和快速验证逻辑。

public class ConsoleCalendar {
    public static void printCalendar(int year, int month) {
        System.out.printf("\n%10s %d\n", Month.of(month), year);
        System.out.println("日 一 二 三 四 五 六");

        int startDay = CalendarUtils.getFirstDayOfWeek(year, month);
        int days = CalendarUtils.getDaysInMonth(year, month);

        for (int i = 0; i < startDay; i++) {
            System.out.print("   ");
        }

        for (int day = 1; day <= days; day++) {
            System.out.printf("%2d ", day);
            if ((day + startDay) % 7 == 0) System.out.println();
        }
        System.out.println();
    }
}
  

4. 图形界面增强(Swing实现)

使用Swing构建简单GUI,提升交互体验。主要组件包括JFrame、JButton、JLabel和JPanel。

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;

public class GUICalendar extends JFrame {
    private int year, month;
    private JLabel title;
    private JPanel dayPanel;

    public GUICalendar() {
        this.year = Year.now().getValue();
        this.month = 1;
        initUI();
    }

    private void initUI() {
        setTitle("简易电子日历");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 标题与按钮
        JPanel top = new JPanel(new FlowLayout());
        JButton prevBtn = new JButton("上一月");
        JButton nextBtn = new JButton("下一月");
        title = new JLabel("", SwingConstants.CENTER);
        updateTitle();

        prevBtn.addActionListener(this::prevMonth);
        nextBtn.addActionListener(this::nextMonth);

        top.add(prevBtn);
        top.add(title);
        top.add(nextBtn);
        add(top, BorderLayout.NORTH);

        // 日历显示区域
        dayPanel = new JPanel(new GridLayout(6, 7));
        refreshCalendar();
        add(dayPanel, BorderLayout.CENTER);

        pack();
        setLocationRelativeTo(null);
    }

    private void refreshCalendar() {
        dayPanel.removeAll();
        String[] weekdays = {"日", "一", "二", "三", "四", "五", "六"};
        for (String w : weekdays) {
            dayPanel.add(new JLabel(w, SwingConstants.CENTER));
        }

        int start = CalendarUtils.getFirstDayOfWeek(year, month);
        int days = CalendarUtils.getDaysInMonth(year, month);
        LocalDate today = LocalDate.now();

        for (int i = 0; i < start; i++) {
            dayPanel.add(new JLabel(""));
        }

        for (int d = 1; d <= days; d++) {
            JLabel label = new JLabel(String.valueOf(d), SwingConstants.CENTER);
            if (year == today.getYear() && month == today.getMonthValue() && d == today.getDayOfMonth()) {
                label.setOpaque(true);
                label.setBackground(Color.YELLOW);
            }
            dayPanel.add(label);
        }

        dayPanel.revalidate();
        dayPanel.repaint();
    }

    private void prevMonth(ActionEvent e) {
        month--;
        if (month < 1) {
            month = 12;
            year--;
        }
        updateTitle();
        refreshCalendar();
    }

    private void nextMonth(ActionEvent e) {
        month++;
        if (month > 12) {
            month = 1;
            year++;
        }
        updateTitle();
        refreshCalendar();
    }

    private void updateTitle() {
        title.setText(String.format("%d年%d月", year, month));
    }
}
  

主程序入口:

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            new GUICalendar().setVisible(true);
        });
    }
}
  

基本上就这些。通过这个项目,你掌握了Java中日期处理、循环布局打印和Swing事件响应的基本应用。功能可进一步扩展,比如添加事件提醒、保存备注等。不复杂但容易忽略细节,比如星期偏移和跨年处理。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

相关专题

更多
go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

6675

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

342

2025.11.27

C++ 面向对象编程与设计模式实践
C++ 面向对象编程与设计模式实践

本专题整合了 C++ 面向对象编程的核心机制,涵盖类的定义与访问控制、构造函数与析构函数、拷贝语义与移动语义、继承与虚函数多态、抽象类与接口、运算符重载、友元函数等关键知识点,同时结合单例模式、工厂模式、观察者模式、策略模式等常用设计模式的 C++ 实现,帮助开发者写出结构清晰、易于维护的面向对象代码。

344

2026.04.09

Java 面向对象与核心编程机制
Java 面向对象与核心编程机制

系统讲解 Java 面向对象编程的核心知识体系,涵盖类的定义与封装、构造方法与 this/super 关键字、继承与方法重写、多态与向上向下转型、抽象类与接口的区别与设计原则、异常处理机制(try-catch-finally / 自定义异常)、泛型的类型参数与通配符、集合框架(List/Set/Map)的使用与遍历方式,帮助开发者全面掌握 Java 程序设计的核心机制与面向对象思维。

223

2026.04.17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

0

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

0

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

0

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn