2012-09-24 18 views
5

Debo decir esto primero, esto NO se trata de Renderizar una celda de tabla.Cómo establecer un objeto personalizado en una fila JTable

Aquí está el TableModel que estoy construyendo usando una matriz 2D basada en un objeto User en mi base de datos.

List<User> userList = userManagerService.getAllUsers(); 

    /* String[] col_user = {"Username", "Name", "Phone", .... } */ 
    String[][] data = new String[userList.size()][col_user.length]; 
    int i = 0; 
    for (User user : userList) { 
     String[] userdata = new String[col_user.length]; 
     userdata[0] = user.getUserUsername(); 
     userdata[1] = user.getUserName(); 
     userdata[2] = user.getUserPhone(); 
     userdata[3] = user.getUserNic(); 
     userdata[4] = user.getUserAddress(); 
     userdata[5] = user.getUserEmail(); 

     data[i++] = userdata; 
    } 

    VstTableItemModel tiModel = new VstTableItemModel(data, col_user); 
    dataTable.setModel(tiModel); 

Mi problema es cómo puedo obtener un objeto User atrás, utilizando la fila seleccionada en la tabla. Tenga en cuenta que no puedo crear un nuevo objeto User y rellenarlo con los datos de la fila. Debo obtener el objeto consultado User (objetos en userList). Entonces, ¿hay alguna manera de establecer un Objeto con una fila de tabla?

Aquí está mi clase VstTableItemModel.

public class VstTableItemModel extends AbstractTableModel { 

    ArrayList<Object[]> data; 
    String[] header; 

    public VstTableItemModel(Object[][] obj, String[] header) { 
     this.header = header; 
     data = new ArrayList<Object[]>(); 

     for (int i = 0; i < obj.length; ++i) { 
      data.add(obj[i]); 
     } 
    } 

    @Override 
    public int getRowCount() { 
     return data.size(); 
    } 

    @Override 
    public int getColumnCount() { 
     return header.length; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 
     return data.get(rowIndex)[columnIndex]; 
    } 

    @Override 
    public String getColumnName(int index) { 
     return header[index]; 
    } 

} 
+0

¿Puede modificar el 'VstTableItemModel'? – MadProgrammer

+0

Sí. ¿Necesito publicarlo aquí? – shan

+0

No, simplemente lo hará más fácil;) – MadProgrammer

Respuesta

13

En lugar de dividir el objeto User hasta antes de crear el modelo, se añadirán directamente al modelo y permitir que el modelo para hacer el trabajo por usted ...

Por ejemplo

public class VstTableItemModel extends AbstractTableModel { 

    private List<User> users; 

    public VstTableItemModel(List<User> users) { 

     this.users = new ArrayList<User>(users); 

    } 

    @Override 
    public int getRowCount() { 
     return users.size(); 
    } 

    @Override 
    public int getColumnCount() { 
     return 6; 
    } 

    @Override 
    public Object getValueAt(int rowIndex, int columnIndex) { 

     Object value = "??"; 
     User user = users.get(rowIndex); 
     switch (columnIndex) { 
      case 0: 
       value = user.getUserUsername(); 
       break; 
      case 1: 
       value = user.getUserName(); 
       break; 
      case 2: 
       value = user.getUserPhone(); 
       break; 
      case 3: 
       value = user.getUserNic(); 
       break; 
      case 4: 
       value = user.getUserAddress(); 
       break; 
      case 5: 
       value = user.getUserEmail(); 
       break; 
     } 

     return value; 

    } 

    @Override 
    public Class<?> getColumnClass(int columnIndex) { 
     return // Return the class that best represents the column... 
    } 

    /* Override this if you want the values to be editable... 
    @Override 
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { 
     //.... 
    } 
    */ 

    /** 
    * This will return the user at the specified row... 
    * @param row 
    * @return 
    */ 
    public User getUserAt(int row) { 
     return users.get(row); 
    } 

} 

de esta manera, usted debería ser capaz de hacer algo así ...

List<User> userList = userManagerService.getAllUsers(); 
VstTableItemModel tiModel = new VstTableItemModel(userList); 

Ahora cuando necesite ... puede agarrar al usuario que representa en una fila específica ...

User user = tiModel.getUserAt(rowIndex); 
+0

Gracias. Pero, ¿qué pasará si lo ordeno? Entonces el índice de la fila cambiará. no es así? – shan

+0

Si está utilizando la API de clasificación de 'JTable', entonces simplemente puede usar' JTable. convertRowIndexToModel' para convertir el índice de la fila de la vista (el 'JTable') en el índice del modelo. – MadProgrammer

+0

Gracias. Esta es la solución que yo quiero. gracias de nuevo ... – shan

Cuestiones relacionadas