我有一个使用 DefaultListModel 的 jList,并用从列表中获取的对象填充它(上下文:对象是 ABM 系统中的一种代理)。
是否可以更改为 jList 中的对象显示的名称?我一直找不到这方面的任何东西...
我有一个使用 DefaultListModel 的 jList,并用从列表中获取的对象填充它(上下文:对象是 ABM 系统中的一种代理)。
是否可以更改为 jList 中的对象显示的名称?我一直找不到这方面的任何东西...
如果您想要查看的信息(而不是任何 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());
我认为名称是由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;
}
}