2010-12-23 133 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

相关问题