2010-12-23 21 views

Respuesta

10

Si la información que desea ver (en lugar de lo toString() escupe) está contenida en el objeto en sí mismo, la forma "oscilación" más directa de lograr esto es a través del uso de 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.

Considere 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()); 
+0

basszero gracias por su explicación detallada e informativa de listcellrenderers y el ejemplo que proporcionó. Aprendí mucho :) – blackace

+0

@blackace - marca la casilla junto a la respuesta para aceptarla y dale a @basszero los puntos que merece. – I82Much

+0

@ i82Much ambas respuestas que he recibido son correctas. No puedo indicar eso de ninguna manera? – blackace

4

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 envoltorio:

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; 
    } 
} 
+0

Gracias por su pronta respuesta. No quiero cambiar el nombre original de los objetos, así que supongo que esa opción está fuera de dudas, a menos que haya algunos trucos que no conozco. En su segunda sugerencia. ¿Podrías ampliarlo? Soy completamente ingenuo acerca de esto. un ejemplo sería extremadamente útil ... – blackace

+0

@blackace: Prueba eso. Debería ser un código lo suficientemente simple como para que pueda ver que es obviamente correcto. Adáptese para adaptarse a su código real (por ejemplo, cambie 'FooBarAgent' y haga lo correcto en' toString'). –

+0

¡Muchas gracias! ahora es claro como el cristal :-) – blackace

Cuestiones relacionadas