Java Swing 日历

简介

在计算机科学和软件开发中,日历是一种常见的功能,用于显示和管理日期和时间。Java Swing 是一种用于构建图形用户界面 (GUI) 的框架,它提供了一组丰富的组件和工具,方便开发者构建用户友好的界面。本文将介绍如何使用 Java Swing 构建一个简单的日历应用程序。

准备工作

在开始编写代码之前,我们需要确保已经安装了 Java Development Kit (JDK)。可以从 Oracle 官方网站上下载并安装适合您操作系统的 JDK 版本。

创建项目

首先,我们需要创建一个新的 Java 项目。可以使用任何集成开发环境 (IDE) 或者命令行工具来完成这个步骤。

导入 Swing 库

在项目中,我们需要导入 javax.swing 包来使用 Swing 组件。在类的开头添加以下代码:

import javax.swing.*;

创建主窗口

接下来,我们需要创建一个主窗口来容纳日历组件。可以创建一个继承自 JFrame 的类,然后在 main 方法中创建该类的实例。

public class CalendarApp extends JFrame {
    public CalendarApp() {
        setTitle("日历应用程序");
        setSize(300, 300);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new CalendarApp());
    }
}

在上面的代码中,我们创建了一个继承自 JFrameCalendarApp 类。在构造函数中,我们设置了窗口的标题、大小、关闭操作和可见性。SwingUtilities.invokeLater() 方法用于确保创建窗口的代码在事件调度线程中执行,以避免线程安全问题。

添加日历组件

我们需要在主窗口中添加一个用于显示日期的组件。在 CalendarApp 类的构造函数中添加以下代码:

JPanel calendarPanel = new JPanel();
add(calendarPanel);

上面的代码创建了一个 JPanel 实例,并将其添加到主窗口中。JPanel 是 Swing 中的容器组件,可以用于放置其他组件。

绘制日历

我们将使用 JTable 组件来绘制日历。JTable 是一个用于显示表格数据的组件,在这里我们将用它来显示日期。在 CalendarApp 类的构造函数中添加以下代码:

String[] columnNames = {"日", "一", "二", "三", "四", "五", "六"};
String[][] data = new String[6][7];

JTable calendarTable = new JTable(data, columnNames);
calendarPanel.add(calendarTable);

上面的代码创建了一个 JTable 实例,并将其添加到 calendarPanel 中。我们使用一个二维数组 data 来存储日期数据,其中行表示周数,列表示星期几。columnNames 数组用于指定表格的列标题。

现在我们已经创建了一个简单的日历应用程序,但是日期数据还没有填充。为了填充日期数据,我们可以使用 Java 的日期和时间类库。

填充日期数据

我们可以使用 java.time 包中的类和方法来操作日期和时间。在 CalendarApp 类的构造函数中添加以下代码:

LocalDate currentDate = LocalDate.now();
LocalDate firstDayOfMonth = currentDate.withDayOfMonth(1);

int monthLength = firstDayOfMonth.lengthOfMonth();
int firstDayOfWeek = firstDayOfMonth.getDayOfWeek().getValue() % 7;

for (int row = 0; row < 6; row++) {
    for (int col = 0; col < 7; col++) {
        int day = row * 7 + col - firstDayOfWeek + 1;
        if (day > 0 && day <= monthLength) {
            data[row][col] = String.valueOf(day);
        }
    }
}

上面的代码首先获取当前日期,并通过 withDayOfMonth() 方法将日期设置为当月的第一天。然后,我们使用 lengthOfMonth() 方法获取当月的天数,并使用 getDayOfWeek().getValue() 方法获取当月第一天是星期几。这样我们就可以在表格中正确的显示日期。