是否可以更改Java Swing jList中项目的名称*显示*?

是否可以更改Java Swing jList中项目的名称*显示*?,java,swing,rename,jlist,defaultlistmodel,Java,Swing,Rename,Jlist,Defaultlistmodel,我有一个使用DefaultListModel的jList,我用从列表中获取的对象填充它(上下文:对象是ABM系统中的一种代理类型) 是否可以更改jList中显示的对象名称?我在这方面找不到任何东西…我认为这些名称是由这些对象的toString()方法生成的。如果你能改变这一点,那是最简单的。否则,一个快速的解决方案是在每个为JList生成对象视图的对象周围包装某种类型的holder对象,当您必须实际操作它时,您可以从中轻松检索包含的对象 要扩展包装器概念,请执行以下操作: class FooBa

我有一个使用DefaultListModel的jList,我用从列表中获取的对象填充它(上下文:对象是ABM系统中的一种代理类型)


是否可以更改jList中显示的对象名称?我在这方面找不到任何东西…

我认为这些名称是由这些对象的
toString()
方法生成的。如果你能改变这一点,那是最简单的。否则,一个快速的解决方案是在每个为JList生成对象视图的对象周围包装某种类型的holder对象,当您必须实际操作它时,您可以从中轻松检索包含的对象

要扩展包装器概念,请执行以下操作:

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;
    }
}
class FooBarAgentHolder{
//简单的javabean内容
私人食品代理;
公共FooBarAgentHolder(FooBarAgent代理){this.agent=agent;}
public FooBarAgent getAgent(){return agent;}
//为人类消费提供名称
公共字符串toString(){
return agent.getDescriptiveName();//或其他任何内容。。。
}
//方便转换功能
公共静态DefaultListModel makeListModel(列表){
DefaultListModel结果=新建DefaultListModel();
用于(FooBarAgent代理:列表)
结果:添加元素(新食品添加剂(代理));
返回结果;
}
}

如果您想要查看的信息(而不是toString()吐出的任何信息)包含在对象本身中,那么实现这一点的最直接的“Swing”方法是使用。可以将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());

谢谢你的及时回复。我不想更改原始对象的名称,所以我想这个选项是不可能的,除非有一些我不知道的技巧。根据你的第二个建议。你能详细介绍一下吗?我对此完全天真。举个例子会非常有用…@blackace:试试看。它应该是足够简单的代码,您可以看到它显然是正确的。适应您的实际代码(例如,更改
FooBarAgent
,并在
toString
中做正确的事情)。basszero感谢您对ListCellRenders和您提供的示例所作的详细而翔实的解释。我学到了很多:)@blackace-选中答案旁边的复选框接受它,并给@basszero他/她应得的分数。@I82我收到的两个答案大部分都是正确的。我不能以任何方式表明这一点?不幸的是,没有,除了把两者都投上一票。向上投票给回答者分数,但不如你接受他们的答案那么多。