Можно ли изменить имена * показанные* для элементов в Java Swing jList?
У меня есть jList, который использует DefaultListModel, и я заполняю его объектами, которые я получаю из списка (контекст: объекты являются типом агента в системе ABM).
можно ли изменить имя показали для объектов в jList? Я ничего не смог найти по этому поводу...
2 ответов
Если информация, которую вы хотите увидеть (вместо того, чтобы выплевывать toString ()), содержится в самом объекте, самый прямой способ "качания" для достижения этого-использование 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;
}
}