2014-11-20 40 views
0

我堅持實現ListCellRenderer。這是我的代碼。實現ListCellRenderer

我從數據庫中域類的形式,看起來像這樣得到的數據:

public class Domain { 

    private Integer id; 
    private String naziv; 
    private Integer status; 

    public Domain(){} 

    public Integer getId() {return id;} 
    public void setId(int i){id = i;} 

    public String getNaziv(){return naziv;} 
    public void setNaziv(String n){naziv = n;} 

    public Integer getStatus(){return status;} 
    public void setStatus(int s){status = s;} 
} 

設置JList中的:

 DefaultListSelectionModel m = new DefaultListSelectionModel(); 
     m.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     m.setLeadAnchorNotificationEnabled(false); 
     DefaultListModel<String> modelRN = new DefaultListModel<String>(); 
     JScrollPane scrollPane = new JScrollPane(); 
     scrollPane.setBounds(10, 86, 390, 199); 
     contentPane.add(scrollPane); 
     JList<String> listRN = new JList<String>(modelRN); 
     scrollPane.setViewportView(listRN); 
     listRN.setBorder(new TitledBorder(null, "", TitledBorder.LEADING, TitledBorder.TOP, null, null)); 
     listRN.setSelectionModel(m); 

,這是我如何填充列表:

 dRN = new DBdomain(s,a,b).Conn(); 
     for(int i=0;i<dRN.size();i++){ 
     modelRN.addElement(dRN.get(i).getNaziv()); 

其中dRN = ArrayList<Domain>

所以問題是這樣的。我使用Domain.getNaziv()字符串填充列表,但我想更改Domain.getStatus()具有特定值的列表中的背景。我知道我需要實現這樣的事情:

public class MyListCellRenderer extends DefaultListCellRenderer { 
     @Override 
     public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
      Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); 
      // do something 
      return c; 
     } 
    } 

的問題是,我不跟域,但與域日提交的是一個字符串填充的jList,所以在getListCellRendererComponent值參數犯規看到申請狀態,以便我不知道如何標記我想改變背景的領域。

希望我提供了所有的信息,並且有人可以指引我走向正確的方向。

回答

4

的問題是,我不跟域名

那麼填充的jList DO填充JList與域名。也許是這樣的:

public class MyListCellRenderer extends DefaultListCellRenderer { 

    @Override 
    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { 
     Component cell = null; 

     if (value instanceof Domain) { 
      Domain domain = (Domain)value; 
      int status = domain.getStatus(); 
      String naziv = domain.getNaziv(); 

      cell = super.getListCellRendererComponent(list, 
       naziv, // note this... 
       index, 
       isSelected, 
       cellHasFocus); 

      if (status > 0) { // or whatever... 
       cell.setBackground(STATUS_ON_COLOR); 
      } else { 
       cell.setBackground(STATUS_OFF_COLOR); 
      } 
     } 
    } 

    return cell; 
} 
+1

儘管我同意數據對象應該作爲模型值傳遞,但渲染器並不是調用'getNaziv()'的正確位置。這樣做會中斷可訪問性和數據傳輸,這依賴於模型值的toString()。最好的方法是覆蓋Domain.toString()或用適當的toString()包裝每個Domain對象。 – VGR 2014-11-20 22:55:52

+0

@whiskeyspider謝謝。你能幫我解決這個問題嗎?不知道該怎麼做。@ VGR – caniaskyouaquestion 2014-11-21 07:16:15

+0

是不是當JList呈現時,它會向ListModel詢問它應該顯示的元素。那麼如何用域名填寫Jlist?我可以看到我需要做什麼之後,渲染每個組件的值爲naziv。 @whiskeyspider – caniaskyouaquestion 2014-11-21 08:21:48