2012-03-01 30 views
5

Tengo un objeto - ArrayList<User> users que contiene algunos objetos de usuario.Agregar objetos a una lista J

public class User 
{ 
    int id; 
    String name; 
    String location; 
} 

Quiero poner esto en un ArrayList JList por lo que mostrará los nombres de los usuarios -

John 
Mick 
Sam 
Joe 

--- Y cuando selecciono un nombre de usuario se activa un suceso que me permite realizar algunas acción usando el objeto de Usuario apropiado. Así que alguien hace clic 'Mick' y me da un código como éste (pseudocódigo) -

public jListClicked(User user) 
{ 
    int id = user.id; 
    String name = user.name; 
    String location = user.location; 

    updateDatabase(id, name, location); 
} 

supongo que esto es posible usando un JList ?? Después de todo, me imagino que es para lo que se creó el componente JList. Entonces, ¿cómo puedo agregar un objeto como ArrayList a una JList así que tendré la funcionalidad anterior?

+2

seguro, todo es posible con :-) oscilación Asegúrese de leer y comprender un tutorial básico, F.I. http://docs.oracle.com/javase/tutorial/uiswing/index.html – kleopatra

Respuesta

4

Una JList toma en uno de sus constructores un Object []. Puede obtener esto de su ArrayList con la función .toArray(). Creo (podría estar equivocado ...) que si su clase de usuario prevalece sobre el método toString(), la JList lo usará cuando muestre su objeto.

public class User 
{ 
    int id; 
    String name; 
    String location; 

    public String toString() { 
     return name; 
    } 
} 

Recomendaría leer la documentación de JList en los documentos de Java. Tiene un ejemplo de cómo crear un renderizador de células personalizado para mostrar los elementos en su lista de la manera que desee que se muestren. Es bastante fácil de seguir. También tiene un ejemplo de cómo crear el oyente de clic de mouse. Debería poder copiar/pegar esto en su mayor parte.

http://docs.oracle.com/javase/6/docs/api/

+0

Correcto, el [renderizador predeterminado] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html# renderizador) muestra objetos que no son iconos al invocar 'toString()'. – trashgod

+3

-1 para sobrescribir a String por motivos de visualización. El modo Swing de representación visual personalizada es un ListCellRenderer personalizado. – kleopatra

+1

@kleopatra es un punto valioso; un enlace al ['JList' tutorial] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html) mejoraría esta respuesta. – trashgod

1

El constructor JList que nos importa en este caso toma una matriz de objetos, como Tony ya se ha señalado. De ahí es donde su respuesta deja de ser útil (sin ofender a Tony).

De forma predeterminada, el ListCellRenderer que utiliza la JList agrega JLabels que contienen el texto de Object # toString(). Entonces, en lugar de pasar cadenas, desea pasarle una matriz de objetos de usuario, luego agregar un ListSelectionListener (que se usa después de que un usuario haga clic en la JList) y un ListCellRenderer (que determina cómo se traduce un objeto de usuario en un JComponent eso se dibujará como parte de la JList).

que quiere hacer algo como esto (ver comentarios en línea para más detalles):

//generate your user data 
User[] userData = ...; 

//add an array of Objects to a JList using the constructor 
//(all classes extend java.lang.Object, including User) 
JList foo = new JList(userData); 

//overwrite the ListCellRenderer. This will take care of just displaying 
//the name of the user 
foo.addListSelectionListener(new ListSelectionListener(){ 
    JLabel rv = new JLabel(); 
    @Override 
    public Component getListCellRendererComponent(JList list, 
      Object value, int index, boolean isSelected, 
      boolean cellHasFocus){ 
     String s = (value != null && value instanceof User)? ((User)value).name:""; 
     rv.setText(s); 
     if (isSelected) { 
      rv.setBackground(list.getSelectionBackground()); 
      rv.setForeground(list.getSelectionForeground()); 
     } else { 
      rv.setBackground(list.getBackground()); 
      rv.setForeground(list.getForeground()); 
     } 
     rv.setEnabled(list.isEnabled()); 
     rv.setFont(list.getFont()); 
     rv.setOpaque(true); 
     return rv; 
    } 
}); 

//Now overwrite the ListSelectionListener which will take care of getting 
//user object when the user clicks it 
foo.addListSelectionListener(new ListSelectionListener(){ 
    @Override 
    public void valueChanged(ListSelectionEvent lse) { 
     User selectedValue = (User)((JList)lse.getSource()).getSelectedValue(); 
     //now you can do something with the User Object that was just selected 
     updateDatabase(selectedValue.id, selectedValue.name, 
       selectedValue.location); 
}); 
Cuestiones relacionadas