首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java AWT 日曆組件完整源碼解析與現代化改造指南

     編輯:Java 相關知識

源碼概覽:基於 AWT 的桌面日曆程序

該程序使用 `java.awt` 包構建獨立窗口應用(繼承 `Frame`),核心邏輯封裝在 `CalenderCreator` 類中,包含:

  • 頂部面板:年份輸入框、月份下拉框、年份下拉框
  • 主面板:7×7 網格按鈕矩陣(表頭 7 天 + 最大 42 天)
  • 邏輯核心:`GregorianCalendar` 計算閏年、月天數、星期偏移
  • 事件驅動:`ItemListener` 響應下拉框變化,`ActionListener` 處理年份輸入

關鍵代碼片段解析

1. 界面佈局與組件初始化

p1 = new Panel(new FlowLayout()); // 頂部控制區
p2 = new Panel(new GridLayout(7, 7, 10, 10)); // 日曆網格
for (int i = 0; i < 49; i++) {
    days[i] = new Button(""); // 預創建 49 個按鈕
    p2.add(days[i]);
}

固定 49 個按鈕(7 行 × 7 列),避免動態創建開銷,體現資源復用思想。

2. 日期計算核心:setVal() 邏輯

void setVal(Date date, int iday, int iselMonth, int iselYear) {
    gc.setTime(date);
    if (大月) totdays = 31;
    else if (小月) totdays = 30;
    else if (二月) totdays = gc.isLeapYear(iselYear) ? 29 : 28;
    setButtons(iday, totdays); // 填充按鈕標籤
}

利用 `GregorianCalendar.isLeapYear()` 簡化閏年判斷,代碼清晰易維護。

3. 按鈕標籤填充:setButtons() 邏輯

void setButtons(int myday, int mytotdays) {
    // 表頭
    days[0].setLabel("SUN"); ... days[6].setLabel("SAT");
    // 空白佔位(上月尾巴)
    int count = 7;
    for (int blank = myday; blank > 0; blank--, count++) days[count].setLabel("");
    // 當月日期
    for (int i = 1; i <= mytotdays; i++, count++) days[count].setLabel(String.valueOf(i));
    // 清空剩餘
    while (count < 49) days[count++].setLabel("");
}

`myday` 為當月 1 號對應的星期索引(0=周日),精確控制對齊。

4. 事件監聽器實現

  • myLis:月份/年份下拉框變化 → 重新計算並刷新網格。
  • myAction:年份輸入框回車 → 動態擴充年份下拉框選項(1990 至輸入年份)。

現代化改造建議:從 AWT 到 Swing/JavaFX

維度AWT 原版Swing 改造JavaFX 改造
組件體系重量級、平台相關輕量級、跨平台一致場景圖、GPU 加速、CSS 樣式
佈局管理FlowLayout/GridLayoutBorderLayout/MigLayout 更靈活FXML + AnchorPane/GridPane 聲明式
日期時間 APIDate/Calendar(已過時)同左java.time.LocalDate/YearMonth(現代標準)
事件模型Listener 接口匿名類同左,可用 Lambda 簡化Lambda + 方法引用,更簡潔
打包部署JAR + JRE同左jlink 定制運行時、原生安裝包

Swing 版關鍵變更點

  • 繼承 `JFrame`,組件前綴 `J`(`JButton`、`JComboBox`、`JPanel`)。
  • 使用 `DefaultComboBoxModel` 動態更新年份列表,替代 `Choice.add()`。
  • 按鈕網格改用 `JToggleButton` 或 `JLabel`(不可編輯),外觀更現代。
  • 啟用 `SwingUtilities.invokeLater()` 確保 EDT 線程安全。

JavaFX 版亮點

  • FXML 分離視圖與邏輯,`DatePicker` 原生支持日曆選擇。
  • CSS 定制單元格樣式(今天高亮、周末灰化、節假日標記)。
  • 綁定 `YearMonth` 屬性自動刷新網格,無需手動監聽。

總結

這段 AWT 代碼雖屬教學級示例,但展示了日曆核心算法(星期對齊、月長度、閏年)與事件驅動架構的經典實現。理解其邏輯後,遷移至 Swing/JavaFX 僅是組件替換與 API 升級,**核心算法完全可復用**。建議初學者先跑通 AWT 版理解原理,再嘗試 JavaFX 版體驗現代開發效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved