搜索
您的当前位置:首页正文

Java 设计——日历可视化

来源:易榕旅网

日历可视化是一个非常有趣的项目,可以让用户以图形方式查看、管理和操作日期。Java 中提供了多种方式来进行图形界面编程,这里我们将使用 Swing 库来实现一个简单的日历可视化界面。Swing 是 Java 中的标准图形用户界面库,支持创建桌面应用程序。

目标

实现一个基本的日历可视化应用,用户可以:

我们将逐步实现以下功能:

  • 显示当前月份的日历。
  • 显示某年某月的日历。
  • 使用按钮跳转到前一个月或下一个月。
  • 高亮显示今天的日期。

一、环境准备

  • 使用 Java Swing 来创建图形界面。
  • 使用 java.util.Calendar 来处理日期和时间。

二、实现步骤

  1. 创建主框架:主框架包括月份和年份的显示,日历的网格,以及前后月份按钮。
  2. 显示当前月份的日历:通过 Calendar 类获取当前的年和月,绘制对应的日期。
  3. 添加按钮事件:用户可以通过按钮跳转到前一个月或下一个月。
  4. 高亮显示今天的日期:获取当前日期并高亮显示。

三、代码实现

3.1 完整代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

public class CalendarVisualizer {

    private JFrame frame;
    private JPanel calendarPanel;
    private JLabel monthLabel;
    private int currentYear, currentMonth;
    private Calendar calendar;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            try {
                CalendarVisualizer window = new CalendarVisualizer();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }

    // 构造函数,初始化界面
    public CalendarVisualizer() {
        frame = new JFrame("Calendar Visualizer");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 400);
        frame.setLayout(new BorderLayout());

        calendar = Calendar.getInstance();
        currentYear = calendar.get(Calendar.YEAR);
        currentMonth = calendar.get(Calendar.MONTH);

        // 创建顶部的月份显示区域
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new FlowLayout());

        JButton prevButton = new JButton("<");
        prevButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                changeMonth(-1);
            }
        });

        monthLabel = new JLabel();
        monthLabel.setFont(new Font("Arial", Font.BOLD, 18));
        updateMonthLabel();

        JButton nextButton = new JButton(">");
        nextButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                changeMonth(1);
            }
        });

        topPanel.add(prevButton);
        topPanel.add(monthLabel);
        topPanel.add(nextButton);

        // 创建日历区域
        calendarPanel = new JPanel();
        calendarPanel.setLayout(new GridLayout(0, 7)); // 7列
        updateCalendar();

        frame.add(topPanel, BorderLayout.NORTH);
        frame.add(calendarPanel, BorderLayout.CENTER);
    }

    // 切换月份
    private void changeMonth(int delta) {
        currentMonth += delta;
        if (currentMonth < 0) {
            currentMonth = 11;
            currentYear--;
        } else if (currentMonth > 11) {
            currentMonth = 0;
            currentYear++;
        }
        updateMonthLabel();
        updateCalendar();
    }

    // 更新月份显示
    private void updateMonthLabel() {
        String[] months = {
            "January", "February", "March", "April", "May", "June",
            "July", "August", "September", "October", "November", "December"
        };
        monthLabel.setText(months[currentMonth] + " " + currentYear);
    }

    // 更新日历的日期网格
    private void updateCalendar() {
        calendarPanel.removeAll();

        // 获取当前月的第一天是星期几
        calendar.set(currentYear, currentMonth, 1);
        int firstDayOfMonth = calendar.get(Calendar.DAY_OF_WEEK);
        int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

        // 添加星期标题
        String[] weekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
        for (String day : weekDays) {
            JLabel dayLabel = new JLabel(day, JLabel.CENTER);
            dayLabel.setFont(new Font("Arial", Font.BOLD, 14));
            calendarPanel.add(dayLabel);
        }

        // 添加空白,直到本月第一天
        for (int i = 1; i < firstDayOfMonth; i++) {
            calendarPanel.add(new JLabel(""));
        }

        // 添加日期
        for (int day = 1; day <= daysInMonth; day++) {
            int currentDay = day;
            JLabel dayLabel = new JLabel(String.valueOf(day), JLabel.CENTER);
            dayLabel.setFont(new Font("Arial", Font.PLAIN, 14));
            dayLabel.setBorder(BorderFactory.createLineBorder(Color.GRAY));

            // 如果是今天,设置高亮
            if (currentYear == calendar.get(Calendar.YEAR) && currentMonth == calendar.get(Calendar.MONTH) && currentDay == calendar.get(Calendar.DAY_OF_MONTH)) {
                dayLabel.setBackground(Color.YELLOW);
                dayLabel.setOpaque(true);
            }

            dayLabel.addMouseListener(new java.awt.event.MouseAdapter() {
                public void mouseClicked(java.awt.event.MouseEvent evt) {
                    System.out.println("Selected date: " + currentDay);
                }
            });

            calendarPanel.add(dayLabel);
        }

        // 重新布局和刷新显示
        calendarPanel.revalidate();
        calendarPanel.repaint();
    }
}

四、代码解析

4.1 界面构建

我们使用了 Swing 来构建日历的用户界面。主要使用了 JFrame 作为窗口容器,JPanel 作为日历的容器,JLabel 用于显示日期和星期。

  1. 顶部区域:显示月份和年份,以及前后月份切换按钮。
  2. 日历区域:一个 GridLayout 用来显示每周 7 天的日期。第一行显示星期名称,接下来是每月的具体日期。
4.2 月份切换

changeMonth 方法实现了前后月份的切换。如果当前月份小于 0,则表示跳转到上一年,并将月份设置为 12;如果当前月份大于 11,则表示跳转到下一年,并将月份设置为 0。

4.3 日历更新

updateCalendar 方法通过获取当前月份的第一天是星期几,和该月的总天数,来生成日历的显示内容:

  • 首先填充星期标题。
  • 然后填充空白格,直到当前月份的第一天。
  • 接着根据月份的天数填充日期。

此外,还为每个日期添加了点击事件,可以通过点击日期来显示选择的日期。

4.4 高亮今天的日期

updateCalendar 方法中,我们通过比较当前年份、月份和日期,来判断是否为今天的日期。如果是今天,则将该日期的背景色设置为黄色,以示高亮。

五、执行效果

  1. 显示当前月份的日历,并能够通过点击前后的按钮来切换月份。
  2. 高亮显示今天的日期,并在点击某个日期时在控制台输出被选中的日期。

六、总结

通过使用 Java Swing 和 Calendar 类,我们成功地实现了一个基本的日历可视化应用。你可以通过这个基础的框架,进一步扩展功能,例如:

  • 添加事件提醒。
  • 为日历日期添加备注。
  • 支持显示其他年份的日历。

这个项目展示了如何将基本的日期计算与图形界面结合,为用户提供便捷的日历操作界面。

因篇幅问题不能全部显示,请点此查看更多更全内容

Top