2011-01-27 68 views
0

HI發生的事情,我有一個JList和賦予它cellRenderer的。但我無法選擇列表中的元素。實際上,它被選中,但在視覺上我們看不到它被選中意味着我無法看到列表中選擇了哪個項目。我的清單列表選擇不擺動

屏幕截圖: enter image description here

和期望是什麼是 enter image description here

第二個截屏是沒有的CellRenderer。但是,當我添加CellRenderer我無法看到列表中選定的項目。

是再正常不過的行爲,當您添加的CellRenderer,要列出。

什麼我做錯了什麼???

編輯: -

這是我的CellRenderer類:

public class ContactsRender extends JLabel implements ListCellRenderer { 

    private static final long serialVersionUID = 1L; 

    ImageIcon img; 

    public ContactsRender(){ 
     setOpaque(true); 
     setIconTextGap(12); 
     setBackground(Color.WHITE); 
     setForeground(Color.black); 
    } 

    @Override 
    public Component getListCellRendererComponent(JList list, 
      Object value, int index, boolean isSelected, 
      boolean cellHasFocus) { 
     if(value != null){ 
      User user = (User) value; 
      String pres = user.getPresence().toLowerCase(); 
      if(pres.contains("unavailable")){ 
       img = new ImageIcon("res/offline.jpg"); 
      } else { 
      img = new ImageIcon("res/online.jpg"); 
      } 
      setText(user.getName()); 
      setIcon(img); 

      return this; 
     } 
     return null; 
    } 

回答

2

你實現你的渲染不正確。渲染器負責將渲染器背景設置爲選擇顏色。

閱讀JList的API,並按照「如何使用列表」在這裏您可以使用一個JList工作實例的鏈接Swing指南。您還可以找到關於編寫渲染器和示例的部分。

編輯:另外,我剛纔注意到你正在閱讀你的圖標在渲染代碼。你永遠不應該這樣做。只有在創建渲染器時才應該讀取圖標,然後緩存圖標。每次單元需要重新繪製時,都會調用渲染器,因此繼續閱讀該圖標效率不高。

+0

我在我的問題中添加了我的CellRenderer類。你能幫我找出那裏有什麼問題嗎? – 2011-01-27 07:11:03

+0

您不設置渲染器的背景。您需要檢查isSelected變量並適當地設置背景。本教程有一個工作示例。花時間閱讀教程。 – camickr 2011-01-27 07:13:20

0

在單元格渲染器,你必須實現的情況下isSelected是真實的。爲你的ListCellRenderer

Component getListCellRendererComponent(JList<? extends E> list, 
             E value, 
             int index, 
             boolean isSelected, 
             boolean cellHasFocus) 
{ 
if (!isSelected) doThis(index); 
else doThatForSelectedItem(index); 
}