日历可视化是一个非常有趣的项目,可以让用户以图形方式查看、管理和操作日期。Java 中提供了多种方式来进行图形界面编程,这里我们将使用 Swing 库来实现一个简单的日历可视化界面。Swing 是 Java 中的标准图形用户界面库,支持创建桌面应用程序。
实现一个基本的日历可视化应用,用户可以:
我们将逐步实现以下功能:
java.util.Calendar
来处理日期和时间。Calendar
类获取当前的年和月,绘制对应的日期。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();
}
}
我们使用了 Swing 来构建日历的用户界面。主要使用了 JFrame
作为窗口容器,JPanel
作为日历的容器,JLabel
用于显示日期和星期。
GridLayout
用来显示每周 7 天的日期。第一行显示星期名称,接下来是每月的具体日期。changeMonth
方法实现了前后月份的切换。如果当前月份小于 0,则表示跳转到上一年,并将月份设置为 12;如果当前月份大于 11,则表示跳转到下一年,并将月份设置为 0。
updateCalendar
方法通过获取当前月份的第一天是星期几,和该月的总天数,来生成日历的显示内容:
此外,还为每个日期添加了点击事件,可以通过点击日期来显示选择的日期。
在 updateCalendar
方法中,我们通过比较当前年份、月份和日期,来判断是否为今天的日期。如果是今天,则将该日期的背景色设置为黄色,以示高亮。
通过使用 Java Swing 和 Calendar
类,我们成功地实现了一个基本的日历可视化应用。你可以通过这个基础的框架,进一步扩展功能,例如:
这个项目展示了如何将基本的日期计算与图形界面结合,为用户提供便捷的日历操作界面。
因篇幅问题不能全部显示,请点此查看更多更全内容