點擊這里下載源文件
  引言
  在圖形用戶界面方面(gui),java一直無法與c++、pb、delphi之類抗衡,使用早期java/awt包所開發(fā)的界面實在是讓人不敢恭維。隨著jfc/swing的日趨成熟,開發(fā)出與可以與c++媲美的gui不再是"不可能完成的任務"。除了具有豐富的界面組件之外,以下優(yōu)秀的特性更讓swing如虎添翼。swing是以100%純java實現(xiàn)的,且輔以jdk 1.1 輕量級ui框架為基礎,沒有本地代碼,獨立于操作系統(tǒng)之外,基于mvc設計模式、采用可插入的外觀感覺(pl&f),這都讓我們忍不住去感受一下她的魅力。
  完整的jfc十分巨大,swing只是其中的一部分,本文將著重于swing包中的jlist組件以及如何定制顯示。
  jlist基礎知識
  由jlist類代表的swing列表顯示一個可選取對象列表,它支持三種選取模式:單選取、單間隔選取、多間隔選取。
  基于mvc的構建思想,jlist類不維護對它所顯示的那些對象的引用,而是把數(shù)據(jù)管理工作委托給一個實現(xiàn)listmodel接口的對象;jlist類不對其顯示對象的選取操作進行跟蹤和維護,而是把選取管理的工作委托給一個實現(xiàn)listselectionmodel接口的對象;jlist類不繪制其所顯示的對象,而是把列表單元的繪制工作委托給一個實現(xiàn)listcellrenderer接口的對象。
  jlist組件把三個主要的工作(數(shù)據(jù)處理、列表項選取、單元繪制)交給其它對對象來完成,jlist的每個實例都維護對上述對象的引用,這樣大大降低了各個功能模塊的耦合度,易于擴展和維護。
  jlist如何顯示對象列表?
  缺省情況下,jlist對象對圖標和字符串對象會按照原樣顯示,而對于其它所有對象只顯示對象tostring()方法的返回值。舉個例子吧,有這樣一個應用程序顯示java.util.locale對象列表給用戶,用戶可以通過選擇列表中的項目來改變應用程序所的處的語言環(huán)境。
  想象一下,jlist將如何顯示一個包含了locale對象的數(shù)據(jù)模型呢?jlist委派javax.swing.listcellrenderer來顯示這些對象。正如我們所料,listcellrenderer將把對象tostring()方法的返回值顯示出來。然而,locale對象返回的是iso代碼,這樣的顯示肯定是不符合"界面交互友好"原則的。默認情況下jlist所顯示的內容讓大多數(shù)用戶感到莫名其妙,如下圖所示:


  color對象tostring()方法返回的是三原色紅、綠、藍(rgb)各分量的亮度值,而不論它所表現(xiàn)的具體顏色是什么。除非用戶知道所選取的第六行0、255、0所代表的是綠顏色,要么我們就應該在這個位置顯示一些對用戶更有幫助的信息。
  誠然,你也許可以把java.lang.string對象的實例放入jlist中以替代color對象的實例,但這么做卻放棄了使用jlist的目的:用戶是要從列表中選用一種顏色并非是選取一段文本描述。
  當使用color對象時,jlist的監(jiān)聽變化的監(jiān)聽器返回的是用戶實際看到的顏色。如果用string對象來替代的話,jlist將把string對象返回到監(jiān)聽器,然后監(jiān)聽器再去匹配與之對應的顏色來完成填充操作,有點多此一舉的感覺。
  尋求解決方案
  作為用戶,我們希望的應用程序應該是界面交互清晰明了的,而不是把locale對象的iso代碼或者是顏色的rgb值顯示出來,界面交互友好的軟件才能吸引用戶。iso代碼或者rgb值對編程的人來說或許有用,但并不適合于終端用戶。
  幸運的是,locale對象有個displayname屬性適合用來為用戶顯示信息。我們可用該屬性來替代tostring()方法用于jlist的顯示,這樣一來就能使得jlist更具可讀性。比較以下代碼片段中l(wèi)ocale對象的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);
最大的網(wǎng)站源碼資源下載站,
| 
 
 | 
新聞熱點
疑難解答