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

Posted

技术标签:

【中文标题】是否可以更改 Java Swing jList 中项目的名称*显示*?【英文标题】:Is it possible to change the names *shown* for the items in a Java Swing jList? 【发布时间】:2011-05-29 22:48:03 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

扩展包装概念:

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;
    

【讨论】:

感谢您的及时回复。我不想更改原始对象的名称,所以我想这个选项是不可能的,除非有一些我不知道的技巧。关于你的第二个建议。你能扩展一下吗?我对此完全天真。一个例子会非常有帮助...... @blackace:试试看。它应该是足够简单的代码,您可以看到它显然是正确的。适应您的实际代码(例如,更改 FooBarAgent 并在 toString 中做正确的事情)。【参考方案2】:

如果您想查看的信息(而不是任何 toString() 吐出的信息)包含在对象本身中,那么完成此操作的最直接“Swing”方法是使用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());

【讨论】:

basszero 感谢您对 listcellrenderers 和您提供的示例的详细而翔实的解释。我学到了很多:) @blackace - 选中答案旁边的框以接受它并给@basszero 应得的分数。 @i82我收到的两个答案都是正确的。我无法以任何方式表明这一点? 不幸的是,没有,除了赞成两者。点赞会给回答者加分,但不会像你接受他们的回答那样多。

以上是关于是否可以更改 Java Swing jList 中项目的名称*显示*?的主要内容,如果未能解决你的问题,请参考以下文章

java swing中jList滚动条位置问题

Java swing弹出菜单和jlist

java swing 中的列表框JList如何在程序中动态的添加和删除元素

Java中Swing组件中的JTextArea,JList控件中的滚动条问题?帮忙解决!

是否可以在java swing中从ListSelectionEvents中提取字符串?

java JList 添加数据后,如何更新啊