国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

JFC/Swing活學活用系列之定制JList顯示

2024-07-21 02:15:01
字體:
來源:轉載
供稿:網(wǎng)友

  點擊這里下載源文件

  引言

  在圖形用戶界面方面(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ù)用戶感到莫名其妙,如下圖所示:


  再來看下面這個例子,更恰如其分地說明了jlist對象的缺省顯示并不能對用戶提供任何有意義的數(shù)據(jù)。假設一個繪圖程序提供了顏色選擇列表,也許你會從中選擇一種顏色用于填充,也許用于繪制線條,或者干什么都可以。盡管我們將java.awt.color對象實例放入jlist中的作法是中規(guī)中矩的,但用戶卻不能從中得到任何的幫助,這背離了我們的初衷。如下圖所示:


  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());
}


  在將有中文windows xp的機器上,運行結果如下所示:

tostring getdisplayname
-------- --------------
en_us 英文 (美國)
fr_fr 法文 (法國)
th_th 泰文 (泰國)
es_mx 西班牙文 (墨西哥)
ja_jp 日文 (日本)

  locale對象的displayname屬性對用戶來說更具可讀性,也更貼近用戶。如果應用程序里的jlist使用displayname屬性,那么看起來會是下面的樣子:


  那么這個效果是怎么實現(xiàn)的呢?為了讓列表在用戶界面上有更好的表現(xiàn),我們要創(chuàng)建自己的listcellrenderer,這樣在上面的例子中就可以通過displayname屬性來替代默認的tostring()方法的返回值。

  類似地,如果我們的選擇顏色的應用程序,我們也可以用定制的listcellrenderer來顯示color對象對應的名稱和它們的顏色。如下圖所示:


  我們先來了解一下listcellrenderer的工作原理,listcellrenderer接口只定義了一個方法,該方法返回一個組件:

public abstract component getlistcellrenderercomponent(jlist list,object value,int index,boolean isselected
boolean cellhasfocus)


  由getlistcellrenderercomponent返回的組件的作用就像一個像皮圖章,它把這個組件繪制到列表中列表項所占的區(qū)域。要注意的一點是,列表單元并不包含這個組件,這個組件只是繪制到列表單元上。這是很重要的,因為不能操縱這個組件,只能使用這個組件的可見代表來繪制列表單元。

  缺省情況下,jlist的實例配備一個繪制器,它是listcellrenderer接口的一個簡單實現(xiàn),即defaultlistcellrenderer類。該類擴展了jlabel類,而且可以顯示字符串或圖標,但不能在一個單元中同時顯示字符串和圖標。

  雖然自定義的listcellrenderer可繼承任何component,但對于上述應用我們選取的解決方案還是使用defaultlistcellrenderer的好,因為繼承了jlabel,可以方便的設置文本、顏色,甚至圖片。參考下面這段代碼:

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;
}


  renderer先調用它的超類的getlistcellrenderercomponent()方法來繪制組件,接下來只需要進行一些簡單的設置就可以了,這里我們使用被選中的locale對象的getdisplayname()方法的返回值來設置文本。

  有了定制的listcellrenderer,讓jlist來使用這個新的renderer就更簡單了,調用jlist對象的setcellrenderer()方法并且把新創(chuàng)建的listcellrenderer實例作為參數(shù)傳遞進去,就足夠了。jlist對象將用定制的renderer來展現(xiàn)列表里每個locale對象。參考下面的代碼片段:

listcellrenderer localerenderer = new localerenderer();
localelist.setcellrenderer(localerenderer);


  定制color選取器的例子與locale的例子有點不同。不同之處在于,裝飾器不僅設置了選項單元的文本內容,還設置了它的顏色與對應的背景色。因為color對象本身里沒有內建的文本名,所以我們需要在顏色名和顏色之間建立映射關系。在這里我們使用hashmap來完成映射操作。具體代碼實例請見參考資料。

  結束語

  最后再提一下對象在jlist中是如何顯示的。不必非得依賴對象提供的tostring()方法,因為我們可以用listcellrenderer來顯示任何想要顯示的和對象相關的文本。此外,我們也可以在選取的作為listcellrenderer的組件上選用任何顏色或圖形來繪制。我們也可以將同樣的繪制器應用于jcombobox。使用定制的listcellrenderer,可以使用jlist和jcombobox組件來編寫用戶界面更加友好的應用程式。

最大的網(wǎng)站源碼資源下載站,

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 西乌珠穆沁旗| 从江县| 容城县| 集安市| 黔西县| 信宜市| 忻州市| 青田县| 安龙县| 黄龙县| 伊金霍洛旗| 比如县| 大姚县| 德清县| 灵丘县| 福泉市| 闵行区| 大新县| 逊克县| 楚雄市| 邯郸市| 恩平市| 长宁区| 平塘县| 潞西市| 道孚县| 三穗县| 如东县| 曲靖市| 平遥县| 沅陵县| 大悟县| 西平县| 枣强县| 大理市| 乌鲁木齐市| 连南| 宝坻区| 瑞金市| 青川县| 都匀市|