点击这里下载源文件
引言
在图形用户界面方面(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所显示的内容让大多数用户感到莫名其妙,如下图所示:
color对象tostring()方法返回的是三原色红、绿、蓝(rgb)各分量的亮度值,而不论它所表现的具体颜色是什么。除非用户知道所选取的第六行0、255、0所代表的是绿颜色,要么我们就应该在这个位置显示一些对用户更有帮助的信息。
诚然,你也许可以把java.lang.string对象的实例放入jlist中以替代color对象的实例,但这么做却放弃了使用jlist的目的:用户是要从列表中选用一种颜色并非是选取一段文本描述。
当使用color对象时,jlist的监听变化的监听器返回的是用户实际看到的颜色。如果用string对象来替代的话,jlist将把string对象返回到监听器,然后监听器再去匹配与之对应的颜色来完成填充操作,有点多此一举的感觉。
寻求解决方案
作为用户,我们希望的应用程序应该是界面交互清晰明了的,而不是把locale对象的iso代码或者是颜色的rgb值显示出来,界面交互友好的软件才能吸引用户。iso代码或者rgb值对编程的人来说或许有用,但并不适合于终端用户。
幸运的是,locale对象有个displayname属性适合用来为用户显示信息。我们可用该属性来替代tostring()方法用于jlist的显示,这样一来就能使得jlist更具可读性。比较以下代码片段中locale对象的tostring()方法和getdisplayname方法的返回值:
locale[] locales = { new locale("en", "us"), new locale("fr", "fr"),
new locale("th", "th"), new locale("es", "mx"),
new locale("ja", "jp") };
system.out.printf("%-10s/t%s/n", "tostring", "getdisplayname");
system.out.printf("%-10s/t%s/n", "--------", "--------------");
for (locale l : locales)
{
system.out.printf("%-10s/t%s/n", l.tostring(), l.getdisplayname());
}
public abstract component getlistcellrenderercomponent(jlist list,object value,int index,boolean isselected
boolean cellhasfocus)
public component getlistcellrenderercomponent(jlist list, object value,
int index, boolean isselected, boolean cellhasfocus)
{
super.getlistcellrenderercomponent(list, value, index, isselected,cellhasfocus);
locale l = (locale) value;
settext(l.getdisplayname());
return this;
}
listcellrenderer localerenderer = new localerenderer();
localelist.setcellrenderer(localerenderer);
最大的网站源码资源下载站,
新闻热点
疑难解答