2010-12-23 135 views

回答

10

要在包裝概念擴大完成這個是通過使用一個ListCellRenderer。將ListCellRenderer(任何CellRenderer真的)想象爲用於在列表中繪製每個對象的橡皮圖章。傳入對象,設置組件,組件繪製對象,然後移動到下一個對象。 CellRenderer從來沒有任何狀態。

考慮這個例子:

// Extend DefaultListCellRenderer, takes care of most of the work for you 
public class ExampleListCellRenderer extends DefaultListCellRenderer 
{ 
    public Component getListCellRendererComponent(
     JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) 
    { 
     // I know DefaultListCellRenderer always returns a JLabel 
     // super setups up all the defaults 
     JLabel label = (JLabel)super.getListCellRendererComponent(list, value, index, isSelect, cellHasFocus); 

     // "value" is whatever object you put into the list, you can use it however you want here 

     // I'm going to prefix the label text to demonstrate the point 

     label.setText("PRE:" + label.getText()); 

     return label; 

    } 
} 

// Some time later... 

JList list = new JList(); 
list.setCellRenderer(new ExampleListCellRenderer()); 
4

我認爲名稱是由這些對象的toString()方法產生的。如果你能改變這一點,那是最簡單的。否則,一個快速解決方案就是在每個包圍JList的對象視圖的周圍包裝某種持有者對象,並且當您必須對其進行真實操作時,可以輕鬆地從中檢索包含的對象。如果你想看到(而不是任何的toString()吐出)的信息包含在對象本身,最直接的「搖擺」的方式來

class FooBarAgentHolder { 
    // Simple javabean stuff 
    private FooBarAgent agent; 
    public FooBarAgentHolder(FooBarAgent agent) { this.agent = agent; } 
    public FooBarAgent getAgent() { return agent; } 

    // Produce the name for human consumption 
    public String toString() { 
     return agent.getDescriptiveName(); // Or whatever... 
    } 

    // Convenience conversion function 
    public static DefaultListModel makeListModel(List<FooBarAgent> list) { 
     DefaultListModel result = new DefaultListModel(); 
     for (FooBarAgent agent: list) 
      result.addElement(new FooBarAgentHolder(agent)); 
     return result; 
    } 
} 
+0

感謝您的及時回覆。我不想更改原始對象名稱,所以我猜這個選項是沒有問題的,除非有一些技巧我不知道。在你的第二個建議。你可以好好擴展它嗎?對此我完全天真。一個例子將是非常有用的... – blackace 2010-12-23 12:21:06

+0

@blackace:試試看。它應該是足夠簡單的代碼,你可以看到它顯然是正確的。適應你的實際代碼(例如,改變`FooBarAgent`並在`toString`中做正確的事情)。 – 2010-12-23 12:52:52

相關問題