作為用戶
我們希望的應用程序應該是界面交互清晰明了的
而不是把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(
%
s\t%s\n
toString
getDisplayName
);
System
out
printf(
%
s\t%s\n
);
for (Locale l : locales)
{
System
out
printf(
%
s\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屬性
那麼看起來會是下面的樣子
那麼這個效果是怎麼實現的呢?為了讓列表在用戶界面上有更好的表現
我們要創建自己的ListCellRenderer
這樣在上面的例子中就可以通過displayName屬性來替代默認的toString()方法的返回值
類似地
如果我們的選擇顏色的應用程序
我們也可以用定制的ListCellRenderer來顯示Color對象對應的名稱和它們的顏色
如下圖所示
我們先來了解一下ListCellRenderer的工作原理
ListCellRenderer接口只定義了一個方法
該方法返回一個組件
Public abstract Component getListCellRendererComponent(JList list
Object value
Int index
boolean isSelected
boolean cellHasFocus)
由getListCellRendererComponent返回的組件的作用就像一個像皮圖章
它把這個組件繪制到列表中列表項所占的區域
要注意的一點是
列表單元並不包含這個組件
這個組件只是繪制到列表單元上
這是很重要的
因為不能操縱這個組件
只能使用這個組件的可見代表來繪制列表單元
缺省情況下
JList的實例配備一個繪制器
它是ListCellRenderer接口的一個簡單實現
即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()方法並且把新創建的ListCellRenderer實例作為參數傳遞進去
就足夠了
JList對象將用定制的renderer來展現列表裡每個Locale對象
參考下面的代碼片段
ListCellRenderer localeRenderer = new LocaleRenderer();
localeList
setCellRenderer(localeRenderer);
定制Color選取器的例子與Locale的例子有點不同
不同之處在於
裝飾器不僅設置了選項單元的文本內容
還設置了它的顏色與對應的背景色
因為Color對象本身裡沒有內建的文本名
所以我們需要在顏色名和顏色之間建立映射關系
在這裡我們使用HashMap來完成映射操作
具體代碼實例請見參考資料
結束語 最後再提一下對象在JList中是如何顯示的
不必非得依賴對象提供的toString()方法
因為我們可以用ListCellRenderer來顯示任何想要顯示的和對象相關的文本
此外
我們也可以在選取的作為ListCellRenderer的組件上選用任何顏色或圖形來繪制
我們也可以將同樣的繪制器應用於JComboBox
使用定制的ListCellRenderer
可以使用JList和JComboBox組件來編寫用戶界面更加友好的應用程式
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26225.html