日期是最基本的数据形式之一因此很多语言或者数据库都提供了对日期的支持或内置或提供这一类的库Java也不例外Java的应用编程接口提供了以跨平台独立语言的方式描述计算对比显示以及便携式分析日期在这篇文章里我要讲讲关于Swing的自定义控制允许你在视觉上获取时间信息而不是用敲命令的方式用这种方法你可以避免无效的时间信息让你的使用者以视觉的方式得到享受
Java中的日期
Java描述日期和时间的方法使用传统的Date命令或者Java的一些子库不管它的名字是什么日期的类并没有普通意义上的日期的概念(日月年等等)技术上讲它仅仅是从年月日 :: GMT开始百万分之一秒的累加的一个结果尽管这些关于日期的类有各种各样的处理日期的方法这都是不够的
为了方便的解决日期问题 JDK 介绍了一个抽象的类javautilCalendar具体的计算日期的子类都会根据日历系统使用一个指向特定日期的指针这是因为日历系统历来就是有很多种方法来计算自己的日期(比如阳历罗马历阴历)
Java应用编程接口提供了名为javautilGregorianCalendar的类来根据阳历系统处理日期信息
最终名为javatextDateFormat的类就是一种抽象的处理格式解释日期种类的独立于语言之外的方式这种方式依靠那些惯例法则以及已知的语言要求的位置运行着名为DateFormat的具体的子类进行实际的工作例如名为javatextSimpleDateFormat的子类允许你根据现有的方式分析或者设定一个日期的格式
总体来说这三个最基本的类(Date Calendar 以及 DateFormat)提供了强大的灵活的处理日期的体系也许开始看来会有些疑惑但你一旦明白了你就会看到这样的结构是十分有意义的并且在其背后有很强的逻辑背景(看看JDK的API文档你就会得到根多的文档和例子)
定做的日期控制
尽管Java提供了你可以对日期数据操作的方法如果让你处理三个不同的类看起来也有些麻烦有时你需要使用很多方法利用很多实体来完成一个简单的任务除那些之外Swing并不能提供进入日期的组件当然如果使用标准的控制如text box也不难完成不过日期在应用中是如此的常见以至于我们常常一遍一遍地写相同的代码输入分析检查时间
基于以上几点原因考虑我建立了一个简单的自定义的控制你可以使用它来访问日期数据基本上说这就是一个显示日期的标准的按钮 (请看图A)
图 A自定义日期控制
当你点击之后会弹出一个日期对话框并允许你选择一个新的日期 (请看表格B)
点击OK键完成一次更新
图 B日历对话框弹出
这样做简化了应用逻辑因为使用者不会访问到一个无效的日期并且由于对话框看上去像一个日历这样做更有利于使用者掌握星期几这个非常有用的日期信息
自定义的按键控制在名为DateButton的类 (列表A)中描述使用起来非常简明—仅仅是列举一个名为DateButton的实体并且像加载普通的控制一样把它加到一个方框中
按键就是表示的日期的实体执行起来就像键入date命令的反映一样这就意外着只要名为PropertyChangeListener的时间寄存器发生变化你就可以设置并得到时间表格 A说明了名为 DateButton 的应用编程接口并且 列表B是一个使用的例子
表格 A
自定义按键控制的应用编程接口
日历对话框
除了自定义一个名为DateButton的控制器之外我们还要建立一个自定义的对话框名为CalendarChooser (参照 列表 C) 你可以自由地从列表中选择月份年份或日子 (参照表格B)尽管它是根据名为Datebutton控制自动显示的你也可以用你自己的方法来使用它建立一个名为 CalendarChooser的类使用一个选好的方式来运行它(参照表格B完成应用编程接口)
表格 B
日历对话框应用编程接口
这个名为DateChooser的类有些复杂我不得不对每个月的日历建立一个新的控制器因为这些标准控制里面没有我需要的另一方面讲这也说明了敬爱能力一个新的控制是多么地容易靠鼠标和键盘地互动就能完成
注意到在年份选择列表中年份的显示是由名为FIRST_YEAR和 LAST_YEAR的常数预先决定的同样地其它常数也决定一些对话框视觉方面(如颜色)的效果稍加设计自由地修改这些参数并不困难
同样地非常重要的一点名为DateChooser的类和名为DateButton的类都是以英式(月份和星期几)或美式日期格式定义的由于这些也是用常数来定义的所以修改起来也十分简单如果你想修改的话这也是完全和语言无关的