熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

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

2013-11-23 19:04:23  來源: Java核心技術 

  作為用戶我們希望的應用程序應該是界面交互清晰明了的而不是把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) };
  Systemoutprintf(%s\t%s\n toString getDisplayName);
  Systemoutprintf(%s\t%s\n );
  for (Locale l : locales)
  {
  Systemoutprintf(%s\t%s\n ltoString() lgetDisplayName());
  }
  
  在將有中文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 listObject valueInt indexboolean 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)
  {
  supergetListCellRendererComponent(list value index isSelectedcellHasFocus);
  Locale l = (Locale) value;
  setText(lgetDisplayName());
  return this;
  }
  
  renderer先調用它的超類的getListCellRendererComponent()方法來繪制組件接下來只需要進行一些簡單的設置就可以了這裡我們使用被選中的Locale對象的getDisplayName()方法的返回值來設置文本
  
  有了定制的ListCellRenderer讓JList來使用這個新的renderer就更簡單了調用JList對象的setCellRenderer()方法並且把新創建的ListCellRenderer實例作為參數傳遞進去就足夠了JList對象將用定制的renderer來展現列表裡每個Locale對象參考下面的代碼片段
  
  ListCellRenderer localeRenderer = new LocaleRenderer();
  localeListsetCellRenderer(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
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.