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

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

JFC/Swing活學(xué)活用之定制JList顯示

2019-11-18 11:55:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

  作為用戶,我們希望的應(yīng)用程序應(yīng)該是界面交互清楚明了的,而不是把Locale對(duì)象的ISO代碼或者是顏色的RGB值顯示出來(lái),界面交互友好的軟件才能吸引用戶。ISO代碼或者RGB值對(duì)編程的人來(lái)說(shuō)或許有用,但并不適合于終端用戶。
  
  幸運(yùn)的是,Locale對(duì)象有個(gè)displayName屬性適合用來(lái)為用戶顯示信息。我們可用該屬性來(lái)替代toString()方法用于JList的顯示,這樣一來(lái)就能使得JList更具可讀性。比較以下代碼片段中Locale對(duì)象的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.  System.out.printf("%-10s/t%s/n", "--------", "--------------");
  for (Locale l : locales)
  {
  System.out.printf("%-10s/t%s/n", l.toString(), l.getDisplayName());
  }
  
  在將有中文
Windows xp的機(jī)器上,運(yùn)行結(jié)果如下所示:
  
  toString getDisplayName
  -------- --------------
  en_US 英文 (美國(guó))
  fr_FR 法文 (法國(guó))
  th_TH 泰文 (泰國(guó))
  es_MX 西班牙文 (墨西哥)
  ja_JP 日文 (日本)
  
  Locale對(duì)象的displayName屬性對(duì)用戶來(lái)說(shuō)更具可讀性,也更貼近用戶。假如應(yīng)用程序里的JList使用displayName屬性,那么看起來(lái)會(huì)是下面的樣子:
  
  
 JFC/Swing活學(xué)活用之定制JList顯示(圖一)

  
  那么這個(gè)效果是怎么實(shí)現(xiàn)的呢?為了讓列表在用戶界面上有更好的表現(xiàn),我們要?jiǎng)?chuàng)建自己的ListCellRenderer,這樣在上面的例子中就可以通過(guò)displayName屬性來(lái)替代默認(rèn)的toString()方法的返回值。
  
  類(lèi)似地,假如我們的選擇顏色的應(yīng)用程序,我們也可以用定制的ListCellRenderer來(lái)顯示Color對(duì)象對(duì)應(yīng)的名稱(chēng)和它們的顏色。如下圖所示:
  
  
 JFC/Swing活學(xué)活用之定制JList顯示(圖二)

  
  我們先來(lái)了解一下ListCellRenderer的工作原理,ListCellRenderer接口只定義了一個(gè)方法,該方法返回一個(gè)組件
  
  Public abstract Component getListCellRendererComponent(JList list,Object value,Int index,boolean isSelected
  boolean cellHasFocus)
  
  由getListCellRendererComponent返回的組件的作用就像一個(gè)像皮圖章,它把這個(gè)組件繪制到列表中列表項(xiàng)所占的區(qū)域。要注重的一點(diǎn)是,列表單元并不包含這個(gè)組件,這個(gè)組件只是繪制到列表單元上。這是很重要的,因?yàn)椴荒懿倏v這個(gè)組件,只能使用這個(gè)組件的可見(jiàn)代表來(lái)繪制列表單元。
  
  缺省情況下,JList的實(shí)例配備一個(gè)繪制器,它是ListCellRenderer接口的一個(gè)簡(jiǎn)單實(shí)現(xiàn),即DefaultListCellRenderer類(lèi)。該類(lèi)擴(kuò)展了JLabel類(lèi),而且可以顯示字符串或圖標(biāo),但不能在一個(gè)單元中同時(shí)顯示字符串和圖標(biāo)。
  
  雖然自定義的ListCellRenderer可繼續(xù)任何Component,但對(duì)于上述應(yīng)用我們選取的解決方案還是使用DefaultListCellRenderer的好,因?yàn)槔^續(xù)了JLabel,可以方便的設(shè)置文本、顏色,甚至圖片。參考下面這段代碼:
  
  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先調(diào)用它的超類(lèi)的getListCellRendererComponent()方法來(lái)繪制組件,接下來(lái)只需要進(jìn)行一些簡(jiǎn)單的設(shè)置就可以了,這里我們使用被選中的Locale對(duì)象的getDisplayName()方法的返回值來(lái)設(shè)置文本。
  
  有了定制的ListCellRenderer,讓JList來(lái)使用這個(gè)新的renderer就更簡(jiǎn)單了,調(diào)用JList對(duì)象的setCellRenderer()方法并且把新創(chuàng)建的ListCellRenderer實(shí)例作為參數(shù)傳遞進(jìn)去,就足夠了。JList對(duì)象將用定制的renderer來(lái)展現(xiàn)列表里每個(gè)Locale對(duì)象。參考下面的代碼片段:
  
  ListCellRenderer localeRenderer = new LocaleRenderer();
  localeList.setCellRenderer(localeRenderer);
  
  定制Color選取器的例子與Locale的例子有點(diǎn)不同。不同之處在于,裝飾器不僅設(shè)置了選項(xiàng)單元的文本內(nèi)容,還設(shè)置了它的顏色與對(duì)應(yīng)的背景色。因?yàn)镃olor對(duì)象本身里沒(méi)有內(nèi)建的文本名,所以我們需要在顏色名和顏色之間建立映射關(guān)系。在這里我們使用HashMap來(lái)完成映射操作。具體代碼實(shí)例請(qǐng)見(jiàn)參考資料。
  
  結(jié)束語(yǔ)
  
  最后再提一下對(duì)象在JList中是如何顯示的。不必非得依靠對(duì)象提供的toString()方法,因?yàn)槲覀兛梢杂肔istCellRenderer來(lái)顯示任何想要顯示的和對(duì)象相關(guān)的文本。此外,我們也可以在選取的作為L(zhǎng)istCellRenderer的組件上選用任何顏色或圖形來(lái)繪制。我們也可以將同樣的繪制器應(yīng)用于JComboBox。使用定制的ListCellRenderer,可以使用JList和JComboBox組件來(lái)編寫(xiě)用戶界面更加友好的應(yīng)用程式。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 黄龙县| 新源县| 崇阳县| 防城港市| 开封市| 乌海市| 嘉祥县| 密云县| 永胜县| 深泽县| 芦山县| 清新县| 即墨市| 逊克县| 雅安市| 鸡西市| 茶陵县| 南宫市| 望城县| 南和县| 铜山县| 太白县| 河北省| 贺州市| 镇康县| 潜江市| 定远县| 乐清市| 丹阳市| 怀安县| 隆回县| 江口县| 温宿县| 巧家县| 连州市| 昌吉市| 山阳县| 保定市| 泸定县| 武宁县| 闸北区|