日期是最基本的數(shù)據(jù)形式之一,因此很多語言或者數(shù)據(jù)庫都提供了對(duì)日期的支持,或內(nèi)置或提供這一類的庫。Java也不例外;Java的應(yīng)用編程接口提供了以跨平臺(tái)獨(dú)立語言的方式描述,計(jì)算,對(duì)比,顯示以及便攜式分析日期。在這篇文章里,我要講講關(guān)于Swing的自定義控制,允許你在視覺上獲取時(shí)間信息而不是用敲命令的方式。用這種方法,你可以避免無效的時(shí)間信息,讓你的使用者以視覺的方式得到享受。
Java中的日期 Java描述日期和時(shí)間的方法使用傳統(tǒng)的Date命令或者Java的一些子庫。不管它的名字是什么,日期的類并沒有普通意義上的日期的概念(日,月,年等等)技術(shù)上講,它僅僅是從1970年1月1日 00:00:00 GMT開始百萬分之一秒的累加的一個(gè)結(jié)果。盡管這些關(guān)于日期的類有各種各樣的處理日期的方法,這都是不夠的。
為了方便的解決日期問題, JDK 1.1 介紹了一個(gè)抽象的類java.util.Calendar。具體的計(jì)算日期的子類都會(huì)根據(jù)日歷系統(tǒng)使用一個(gè)指向特定日期的指針。這是因?yàn)槿諝v系統(tǒng)歷來就是有很多種方法來計(jì)算自己的日期(比如陽歷,羅馬歷,陰歷)。
Java應(yīng)用編程接口提供了名為java.util.GregorianCalendar的類來根據(jù)陽歷系統(tǒng)處理日期信息。
最終,名為java.text.DateFormat的類就是一種抽象的處理格式解釋日期種類的獨(dú)立于語言之外的方式。這種方式依靠那些慣例,法則,以及已知的語言要求的位置運(yùn)行著。名為DateFormat的具體的子類進(jìn)行實(shí)際的工作。例如,名為java.text.SimpleDateFormat的子類允許你根據(jù)現(xiàn)有的方式分析或者設(shè)定一個(gè)日期的格式。
總體來說,這三個(gè)最基本的類(Date, Calendar, 以及 DateFormat)提供了強(qiáng)大的靈活的處理日期的體系。也許開始看來會(huì)有些疑惑,但你一旦明白了,你就會(huì)看到這樣的結(jié)構(gòu)是十分有意義的,并且在其背后有很強(qiáng)的邏輯背景。(看看JDK的API文檔,你就會(huì)得到根多的文檔和例子)
定做的日期控制 盡管,Java提供了你可以對(duì)日期數(shù)據(jù)操作的方法,如果讓你處理三個(gè)不同的類,看起來也有些麻煩。有時(shí)你需要使用很多方法,利用很多實(shí)體來完成一個(gè)簡(jiǎn)單的任務(wù)。除那些之外,Swing并不能提供進(jìn)入日期的組件。當(dāng)然,如果使用標(biāo)準(zhǔn)的控制如text box也不難完成。不過,日期在應(yīng)用中是如此的常見,以至于我們常常一遍一遍地寫相同的代碼,輸入,分析,檢查時(shí)間。
基于以上幾點(diǎn)原因考慮,我建立了一個(gè)簡(jiǎn)單的自定義的控制,你可以使用它來訪問日期數(shù)據(jù)。基本上說,這就是一個(gè)顯示日期的標(biāo)準(zhǔn)的按鈕 (請(qǐng)看圖A)。
圖 A  自定義日期控制 |
當(dāng)你點(diǎn)擊之后,會(huì)彈出一個(gè)日期對(duì)話框,并允許你選擇一個(gè)新的日期 (請(qǐng)看表格B)。
點(diǎn)擊OK鍵完成一次更新。
圖 B  |
日歷對(duì)話框彈出
這樣做簡(jiǎn)化了應(yīng)用邏輯,因?yàn)槭褂谜卟粫?huì)訪問到一個(gè)無效的日期。并且由于對(duì)話框看上去像一個(gè)日歷,這樣做更有利于使用者掌握星期幾這個(gè)非常有用的日期信息。
自定義的按鍵控制在名為DateButton的類 (列表A)中描述。使用起來非常簡(jiǎn)明—僅僅是列舉一個(gè)名為DateButton的實(shí)體,并且像加載普通的控制一樣把它加到一個(gè)方框中。
按鍵就是表示的日期的實(shí)體,執(zhí)行起來就像鍵入“date”命令的反映一樣。這就意外著只要名為PropertyChangeListener的時(shí)間寄存器發(fā)生變化你就可以設(shè)置并得到時(shí)間。表格 A說明了名為 DateButton 的應(yīng)用編程接口,并且 列表B是一個(gè)使用的例子。
表格 A
自定義的按鍵應(yīng)用編程接口是十分簡(jiǎn)單的。你可以利用其中的一個(gè)構(gòu)造器來建立一個(gè)例子,并且正確地獲取或設(shè)置時(shí)間信息。需要注意的是這是一個(gè)標(biāo)準(zhǔn)的按鍵,也因此它繼承了很多標(biāo)準(zhǔn)按鍵的方式,包括注冊(cè)的方式。 |
方法 |
描述 |
DateButton(Date) |
建立一個(gè)新的名為DateButton的類,用來初始化日期。 |
DateButton( ) |
建立一個(gè)新的名為DateButton的類,用來初始化系統(tǒng)日期。 |
getDate( ) |
得到正確的日期值。 |
setDate(Date) |
設(shè)置正確的日期值。 |
自定義按鍵控制的應(yīng)用編程接口 日歷對(duì)話框
除了自定義一個(gè)名為DateButton的控制器之外,我們還要建立一個(gè)自定義的對(duì)話框,名為CalendarChooser (參照 列表 C), 你可以自由地從列表中選擇月份,年份或日子 (參照表格B)。盡管它是根據(jù)名為Datebutton控制自動(dòng)顯示的,你也可以用你自己的方法來使用它。建立一個(gè)名為 CalendarChooser的類,使用一個(gè)選好的方式來運(yùn)行它(參照表格B完成應(yīng)用編程接口)。
表格 B
使用日歷對(duì)話框選擇一個(gè)日期是非常簡(jiǎn)單的。使用一個(gè)構(gòu)件器來建造一個(gè)對(duì)話框的實(shí)體,使用其中的一種方法來選擇日期。 |
方法 |
描述 |
DateChooser(Dialog, title) |
建立一個(gè)新的名為DateChooser的類,并且賦予其標(biāo)題和對(duì)話信息。 |
DateChooser(Dialog) |
建立一個(gè)新的名為DateChooser的類,并且賦予其對(duì)話信息。 |
DateChooser(Frame, title) |
建立一個(gè)新的名為DateChooser的類,并且賦予其框架和對(duì)話信息。 |
DateChooser(Frame) |
建立一個(gè)新的名為DateChooser的類,并且賦予其框架。 |
select(Date) |
顯示一個(gè)已選好日期的對(duì)話框,你可以任意改變?nèi)掌冢环祷剡x擇好的日期。如果你取消對(duì)話框則返回一個(gè)空值,并關(guān)閉對(duì)話框。 |
select( ) |
與上述相同,用系統(tǒng)日期代替選擇的日期。 |
日歷對(duì)話框應(yīng)用編程接口 這個(gè)名為DateChooser的類,有些復(fù)雜。我不得不對(duì)每個(gè)月的日歷建立一個(gè)新的控制器,因?yàn)檫@些標(biāo)準(zhǔn)控制里面沒有我需要的。另一方面講,這也說明了敬愛能力一個(gè)新的控制是多么地容易,靠鼠標(biāo)和鍵盤地互動(dòng)就能完成。
注意到在年份選擇列表中年份的顯示,是由名為FIRST_YEAR和 LAST_YEAR的常數(shù)預(yù)先決定的。同樣地,其它常數(shù)也決定一些對(duì)話框視覺方面(如顏色)的效果。稍加設(shè)計(jì),自由地修改這些參數(shù)并不困難。
同樣地,非常重要的一點(diǎn),名為DateChooser的類和名為DateButton的類都是以英式(月份和星期幾)或美式日期格式定義的。由于這些也是用常數(shù)來定義的,所以修改起來也十分簡(jiǎn)單。如果你想修改的話,這也是完全和語言無關(guān)的。