標準 Swing 缺乏原生日期選擇組件。手工解析文本框輸入易出錯、用戶體驗差。本文實現一個可復用的 DateButton (顯示日期、彈出選擇) 與 CalendarChooser (月曆對話框),封裝 java.util.Calendar、DateFormat 等核心 API,提供直觀的視覺化交互。
| 類 | 職責 | 關鍵 API |
|---|---|---|
DateButton | 繼承 JButton,顯示日期文本,點擊彈出 CalendarChooser | getDate()/setDate(Date), PropertyChangeListener |
CalendarChooser | 模態對話框,包含年/月下拉框、日期網格面板、確定/取消按鈕 | select(Date)/select() 返回選中日期或 null |
DateButton dateBtn = new DateButton(new Date()); // 初始化為今天
panel.add(dateBtn);
// 監聽日期變更
dateBtn.addPropertyChangeListener("date", evt -> {
Date newDate = (Date) evt.getNewValue();
System.out.println("用戶選擇: " + newDate);
});
CalendarChooser chooser = new CalendarChooser(parentFrame, "選擇出生日期");
Date birth = chooser.select(); // 彈出對話框,阻塞直到用戶操作
if (birth != null) { /* 用戶點擊確定 */ }
JPanel 組成,處理滑鼠懸停/選中高亮、鍵盤導航。FIRST_YEAR/LAST_YEAR) 皆為常量,易本地化。Calendar,UI 僅負責渲染與事件分發。
JFormattedTextField 實現直接輸入同步。java.time.LocalDate 替代 Date。通過組合 Swing 基礎組件與核心日期 API,僅用幾百行代碼即可構建專業級日期選擇器,消除無效輸入、提升用戶體驗,是掌握 Swing 自定義組件開發的經典練習。