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

开发一个简易电子日历是Java初学者巩固面向对象编程、日期处理和图形界面设计的绝佳项目。本文将带你一步步实现一个基础但功能完整的电子日历,涵盖核心逻辑与界面展示。
本电子日历支持以下基本功能:
项目采用Java标准库,无需引入第三方依赖,适合学习使用。
关键在于准确计算某个月的第一天是星期几,并输出对应的日历布局。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();
}
}
使用字符画形式在控制台输出日历表格,便于调试和快速验证逻辑。
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();
}
}
使用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事件响应的基本应用。功能可进一步扩展,比如添加事件提醒、保存备注等。不复杂但容易忽略细节,比如星期偏移和跨年处理。
以上就是在Java中如何开发简易电子日历_电子日历项目实战解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号