# 日历工具

# 描述

编写基于Java的图形化日历组件显示日期和时间并进行适当的功能扩充。要求如下:

  1. 支持农历日历的显示,公历日历的显示
  2. 显示当月日历、当前日期、当前时间
  3. 可查询任意月以及任意年的日历
  4. 可以查询某一天是周几(按公元1年1月1日是周一算)
  5. 可以在某一天添加事件或提醒
  6. 使用图形化界面弹出特定日期的提醒
  7. 正常运行和退出程序,退出程序事件要保留,再次查看时可提醒
  8. 界面简洁美观
  9. 其他创意功能

# 预览图

图一 日历

图二 日历提醒和事件

# 功能描述

  1. 最上方时间会每秒刷新,实时显示当前时间。
  2. 年月右侧的按钮'<'和'>'可以实现月份的增加和减少,并更新日历面板的数据。
  3. 点击日历面板具体的某一天会在下方显示星期、天干地支、生肖、农历信息以及当天的事件列表。
  4. 提醒事件会在当天触发提醒弹窗,可在下方输入框为点击后的日期添加提醒事件。
  5. 程序运行和退出会存档事件,下次运行会自动载入事件。

其他创意功能为天干地支和十二生肖年的展示

# 部分代码展示

package calendar;

import calendar.pane.CalendarPane;
import calendar.pane.EventPane;
import calendar.pane.TimePane;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("日历");
        // 总面板
        BorderPane root = new BorderPane();
        // 设置外边距
        root.setPadding(new Insets(10, 20, 10, 20));
        // 时间面板
        root.setTop(new TimePane());
        // 日历面板
        root.setCenter(new CalendarPane());
        // 事件面板
        root.setBottom(new EventPane());
        // 设置大小
        primaryStage.setScene(new Scene(root, 470, 750));
        // 显示主窗口
        primaryStage.show();
        // 主窗口关闭时的回调 保存事件
        primaryStage.setOnCloseRequest(e -> EventPane.saveEvent());
    }


    public static void main(String[] args) {
        launch(args);
    }
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

这边只展示部分UI代码

遵循30%注释原则,本项目代码注释较为详细。

# 开发日志

# 开发者说

开发GUI桌面端正常是不会选择Java技术栈的,但是题目要求Java,只能硬上了。 这也是本人第一次接触Java GUI开发,开发体验一般。

本项目基于JDK1.8开发,注意!!!Java FX在JDK1.8之后被移除。 初版采用Java Swing进行开发,开发过程中发现体验极差,故采用Java FX重构。 由于本项目较为简单,故没有采用Java FX的领域语言FXML进行模板化开发, 采用纯代码的方式进行UI的开发。计算农历的代码来自网络,如果造轮子需要很长时间 的时候,不妨试试别人的轮子。

# 可优化点

本项目作为课程设计已然达到全部要求,且开发周期较短,约为1.5天。 但作为日常工具使用的话,需要进行优化,下面列举一些需要优化的点:

  1. 代码组织方式,推荐使用FXML进行模版化重构,事件和数据结构会更合理, 且不需要数据在各个组件之间交互。 若仍采用纯代码UI,也可以只使用一个类组织UI组件, 从而简化组件之间的数据交互。
  2. 选中的日期和当天的日期可以做高亮处理。
  3. 事件提醒时间只做到了某年某月某日,可以精确到分。
  4. 组件事件相关优化。
  5. UI背景色等样式相关优化。
上次更新: 5 minutes ago