java - valor - Cómo establecer un objeto personalizado en una fila JTable
seleccionar una fila de un jtable desde codigo (1)
Debo decir esto primero, esto NO es sobre renderizar una celda de tabla.
Aquí está el modelo de tabla que estoy construyendo usando una matriz 2D basada en un objeto de 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 recuperar un objeto User
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 User
consultado (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];
}
}
En lugar de dividir el objeto User
antes de crear el modelo, agréguelo directamente al modelo y permita que el modelo haga 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, deberías ser capaz de hacer algo como ...
List<User> userList = userManagerService.getAllUsers();
VstTableItemModel tiModel = new VstTableItemModel(userList);
Ahora cuando necesitas ... puedes agarrar al usuario que está representando en una fila específica ...
User user = tiModel.getUserAt(rowIndex);