Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con combo en JTable.

Estas en el tema de Problema con combo en JTable. en el foro de Java en Foros del Web. Hola a todos. Primero que todo, agradezco el tiempo que se tomen para mirar este tema. Tengo un problema al mostrar combos en una columna ...
  #1 (permalink)  
Antiguo 24/04/2013, 18:54
 
Fecha de Ingreso: diciembre-2012
Mensajes: 7
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta Problema con combo en JTable.

Hola a todos.

Primero que todo, agradezco el tiempo que se tomen para mirar este tema. Tengo un problema al mostrar combos en una columna de un JTable.

Lo que tengo es lo siguiente, tengo un desarrollo de pólizas de autos donde una póliza tiene varios carros.

Según eso, lo que quiero es mostrar una fila con las pólizas existentes y que en una columna que tiene un combo, se muestren los carros que tiene asociados cada póliza.

Yo estoy trabajando con un manejador de tablas que implementa la interfaz TableModel (la clase se llama TableModelSearchPolicy, por tanto, se necesita definir los métodos getRowCount(), getColumnCount(), getValueAt(int rowIndex, int columnIndex), setValueAt(Object columnValue, int rowIndex, int columnIndex), getColumnName(int columnIndex), getColumnClass(int columnIndex) y public boolean isCellEditable(int rowIndex, int columnIndex).

Ahora, para cargar el combo utilizo el siguiente código (está en el método (jbtSearchActionPerformed() de la clase FormSearchPolicy):

if (!policyList.isEmpty()) { // es un List con las pólizas existentes.
// se quitan las pólizas de la tabla.
tableModel.removeAllPolicies(); // borro las filas que ya tenga la tabla.
for (int i = 0; i < policyList.size(); i++) { // ciclo for para obtener cada póliza.
tableModel.addPolicy(policyList.get(i)); // agrego cada póliza a la tabla (tableModel es un objeto instanciado de TableModelSearchPolicy).
// aquí establezco que la columna 4 va a ser un combo, que lo lleno con una instancia de una InnerClass que se llama JComboBoxCars.
jtbPolicies.getColumnModel().getColumn(4).setCellE ditor(new JComboBoxCars(policyList.get(i))); // jtbPolicies es un objeto instanciado de JTable.
setColumnsWidth(); // este es un método que ajusta el ancho de las columnas de la tabla.
}
}
}

La clase JComboBoxCars es la siguiente (esto lo vi buscando en Internet y lo implementé). Básicamente lo que se hace es recibir una póliza por parámetro y recorrer la lista de carros que tiene asociada en su método getCarList() y llenar el combo y al final retornarlo.

class JComboBoxCars extends DefaultCellEditor {
Policy policy = null;

public JComboBoxCars(Policy policy) {
super (new JComboBox());
this.policy = policy;
}

public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JComboBox combo = (JComboBox) getComponent();
combo.removeAllItems();

for (int i = 0; i < policy.getCarList().size(); i++) {
combo.addItem(policy.getCarList().get(i));
}
combo.setSelectedIndex(0);
return combo;
}
}
}

Recién se muestra la tabla, la información se ve bien. el tema es que cuando le doy click al combo de la primera fila, me aprece la información del último combo cargado, es decir el de la última fila. Pero cuando ya selecciono algún elemento del combo, vuelve y me deja la información del combo que es.

Yo creo que el problema, va a estar en él métodos getValueAt, ya que por debbug, cuando le doy click al combo, se activa este método y en primera instancia, llega la fila 0 (la que debe ser porque es la fila donde le hago click), pero inmediatamente procesa la fila 1, que no debería ser, y por tanto, llena el combo del campo 4 con la información de esta fila.

Esos métodos los tengo así:

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Policy policy = (Policy) rows.get(rowIndex); // como el método es obtener la información de la tabla, entonces recupero la fila que la tengo en un LinkedList y obtengo cada valor.

switch (columnIndex) {
case 0:
return policy.getIdPolicy1() + " - " + policy.getIdPolicy2() + " - " + policy.getIdPolicy();
case 1:
return policy.getCustomer().getNameCustomer();
case 2:
return policy.getEffectiveDatePolicy();
case 3:
return policy.getExpirationDatePolicy();
case 4:
return policy.getCarList(); // aquí creería que está bien, porque debe mostrarse los carros que tenga la póliza.
case 5:
//return jcbDrivers;
// return policy.getCarList().get(rowIndex).getDriverList();
default:
return null;
}
}

------------------------------------------------------------------------------------------------------------------------------------------------------

@Override
public void setValueAt(Object columnValue, int rowIndex, int columnIndex) {
// aquí la idea es recuperar la fila indicada por parámetro y cambiar los valores que vienen para cada columna en el parámetro columnValue.
Policy policy = (Policy) rows.get(rowIndex);

switch (columnIndex) {
case 0:
policy.setIdPolicy((Integer) columnValue);
break;
case 1:
policy.getCustomer().setNameCustomer((String) columnValue);
break;
case 2:
policy.setEffectiveDatePolicy((Date) columnValue);
break;
case 3:
policy.setExpirationDatePolicy((Date) columnValue);
break;
case 4:
// aquí si tengo dudas, se supone que la fila que llega por parámetro debe llenarse con la información que trae el parámetro columnValue, que cuando llega a este
// case es de tipo Car, pero no se como manejarlo, si actualizar el getCarList del objeto Policy o crear un nuevo combo (que es lo que puse), lo he intentado de
// varias maneras y ninguna me ha funcionado.
new FormSearchPolicy().new JComboBoxCars(((Car) columnValue).getPolicy());
break;
// case 5:
// List<Driver> driverList = new ArrayList<>();
// driverList.add((Driver) columnValue);
// //policy.setCarList(carList);
// break;
}
}



Si alguien quisiera ayudarme, pueden contactarme al GTalk [email protected]


Muchas gracias.

Etiquetas: clase, combo, jtable
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:06.