2012-09-24 16 views
5

Dovrei dirlo prima, questo NON riguarda il rendering di una cella di tabella.Come impostare un oggetto personalizzato in una riga di JTable

Ecco il TableModel che sto costruendo utilizzando un array 2D basato su un oggetto User nel mio DB.

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); 

Il mio problema è come posso ottenere un oggetto User indietro, utilizzando la riga selezionata nella tabella. Si noti che non è possibile creare un nuovo oggetto User e popolarlo con i dati della riga. Devo ottenere l'oggetto User interrogato (oggetti in userList). Quindi, è il loro modo di impostare un oggetto con una riga della tabella?

Ecco la mia classe 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

Sei in grado di modificare il 'VstTableItemModel'? – MadProgrammer

+0

Sì. Devo postarlo qui? – shan

+0

No, lo renderà più semplice;) – MadProgrammer

risposta

13

Invece di dividere l'User oggetto up prima di creare il modello, inserirlo direttamente al modello e consentire il modello per fare il lavoro per voi ...

Per esempio

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); 
    } 

} 

in questo modo, si dovrebbe essere in grado di fare qualcosa di simile ...

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

Ora quando è necessario ... puoi prendere un utente che rappresenta una riga specifica ...

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

Grazie. Ma cosa succederà se lo ordinerò? Quindi l'indice della riga cambierà. non è vero? – shan

+0

Se usi l'API di ordinamento di 'JTable', puoi semplicemente usare' JTable. convertRowIndexToModel' per convertire l'indice di riga della vista (il 'JTable') all'indice del modello. – MadProgrammer

+0

Grazie. Questa è la soluzione che voglio. grazie ancora ... – shan

Problemi correlati