在图形用户界面方面(GUI),Java一直无法与C++、PB、Delphi之类抗衡,使用早期Java/AWT包所开发的界面实在是让人不敢恭维。随着JFC/Swing的日趋成熟,开发出与可以与C++媲美的GUI不再是"不可能完成的任务"。除了具有丰富的界面组件之外,以下优秀的特性更让Swing如虎添翼。Swing是以100%纯Java实现的,且辅以JDK 1.1 轻量级UI框架为基础,没有本地代码,独立于操作系统之外,基于MVC设计模式、采用可插入的外观感觉(PL&F),这都让我们忍不住去感受一下她的魅力。
完整的JFC十分巨大,Swing只是其中的一部分,本文将着重于Swing包中的JList组件以及如何定制显示。
JList基础知识
由JList类代表的Swing列表显示一个可选取对象列表,它支持三种选取模式:单选取、单间隔选取、多间隔选取。
基于MVC的构建思想,JList类不维护对它所显示的那些对象的引用,而是把数据管理工作委托给一个实现ListModel接口的对象;JList类不对其显示对象的选取操作进行跟踪和维护,而是把选取管理的工作委托给一个实现 ListSelectionModel接口的对象;JList类不绘制其所显示的对象,而是把列表单元的绘制工作委托给一个实现 ListCellRenderer接口的对象。
JList组件把三个主要的工作(数据处理、列表项选取、单元绘制)交给其它对对象来完成,JList的每个实例都维护对上述对象的引用,这样大大降低了各个功能模块的耦合度,易于扩展和维护。
JList如何显示对象列表?
缺省情况下,JList对象对图标和字符串对象会按照原样显示,而对于其它所有对象只显示对象toString()方法的返回值。举个例子吧,有这样一个应用程序显示java.util.Locale对象列表给用户,用户可以通过选择列表中的项目来改变应用程序所的处的语言环境。
想象一下,JList将如何显示一个包含了Locale对象的数据模型呢?JList委派javax.swing.ListCellRenderer来显示这些对象。正如我们所料,ListCellRenderer将把对象toString()方法的返回值显示出来。然而,Locale对象返回的是ISO代码,这样的显示肯定是不符合"界面交互友好"原则的。默认情况下JList所显示的内容让大多数用户感到莫名其妙,如下图所示:


诚然,你也许可以把java.lang.String对象的实例放入JList中以替代Color对象的实例,但这么做却放弃了使用JList的目的:用户是要从列表中选用一种颜色并非是选取一段文本描述。
当使用Color对象时,JList的监听变化的监听器返回的是用户实际看到的颜色。如果用String对象来替代的话,JList将把String对象返回到监听器,然后监听器再去匹配与之对应的颜色来完成填充操作,有点多此一举的感觉。
