JCalendar 是一個好用的日期選擇元件,而且還是免費的。下載網址:http://www.toedter.com/en/jcalendar/index.html

今天在寫 MVC 架構,為了把 view 的資料經由 control 傳遞到 model 裏,所以需要監聽 JCalendar 的事件。看了一下原始程式裏面的範例,發現 propertyChange 的存在,就測試了一下 PropertyChangeListener。

JDateChooser dateChooser = new JDateChooser(); dateChooser.addPropertyChangeListener(new Control()); public abstract class Control implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName() == "date") { System.out.println(e.getNewValue().getClass()); System.out.println(e.getNewValue()); } } }

最後發現原始程式是比對 calendar,而實際上卻是 date;而取得新值是 class java.util.Date,而不是 class String 喔。


今天又發現當 JDateChooser 輸入是錯的日期,會變成紅色,但是卻沒有觸發 PropertyChangeEvent,造成日期選錯了,但值仍然是舊的而且也無法知道錯誤發生。最後只好去看 source code,原來觸發 PropertyChangeEvent 是在 JTextFieldDateEditor.java 裏面的 setDate 函數。而問題是在 checkText() 時會發生例外,而無法進入 setDate 函數。所以只好繼承 JTextFieldDateEditor 寫一個新的來修改。

DateChooser dateChooser = new JDateChooser(new JTextFieldDateEditor2()); dateChooser.addPropertyChangeListener(new Control()); public abstract class Control implements PropertyChangeListener { @Override public void propertyChange(PropertyChangeEvent e) { if (e.getPropertyName() == "date") { System.out.println(e.getNewValue().getClass()); System.out.println(e.getNewValue()); } } } public class JTextFieldDateEditor2 extends JTextFieldDateEditor { @Override public void setDate(Date date, boolean firePropertyChange) { if (date == null) { if (firePropertyChange) firePropertyChange("date", this.date, date); } else { super.setDate(date, firePropertyChange); } } @Override public void focusLost(FocusEvent focusEvent) { Date date=null; try { date = dateFormatter.parse(getText()); } catch (Exception e) { // ignore } setDate(date, true); } }

由於 checkText() 是 private 函數,所以無法直接覆寫,所以只好找有呼叫 checkText() 的函數。查了一下,發現還蠻多的,但主要是在 focusLost 修改即可,其它的也就不用太在意了。

創作者介紹

邱小新の工作筆記

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()