obtener - ¿Es posible cambiar los nombres*que se muestran*para los artículos en una JavaLink JList?
leer jlist (2)
Creo que los nombres son producidos por los métodos toString()
de esos objetos. Si puedes cambiar eso, es más fácil. De lo contrario, una solución rápida sería envolver algún tipo de objeto de soporte alrededor de cada uno que genere la vista del objeto para la Lista J y desde la cual pueda recuperar el objeto contenido con la suficiente facilidad cuando tenga que manipularlo de manera real.
Para ampliar el concepto de envoltura:
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;
}
}
Tengo una jList que usa DefaultListModel y la rellene con Objetos que obtengo de una lista (contexto: los objetos son un tipo de agente en el sistema ABM).
¿Es posible cambiar el nombre que se muestra para los objetos en jList? No he podido encontrar nada en esto ...
Si la información que desea ver (en lugar de lo que toString () arroja) está contenida en el objeto en sí, la forma más directa de "Swing" para lograr esto es mediante el uso de un ListCellRenderer . Piense en un ListCellRenderer (cualquier CellRenderer realmente) como un sello de goma utilizado para dibujar cada objeto en su lista. El objeto se transfiere, configura el componente, el componente dibuja su objeto y luego pasa al siguiente objeto. El CellRenderer nunca tiene ningún estado.
Considera este ejemplo:
// 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());