2010-04-19 15 views
6

No estoy seguro de por qué esto es recursivo.StackOverflowError causado por un TableModelListener

jTable1.getModel().addTableModelListener(new TableModelListener() { 

public void tableChanged(TableModelEvent evt) { 
    int sum = 0; 
    int i=0; 
    for (i =0 ; i<2; i++){ 
    sum = sum + Integer.parseInt(jTable1.getValueAt(0, i).toString()); 
    } 
    jTable1.setValueAt(sum, 0, 2); 
} 

}); 

La excepción es: (es sigue repitiendo)

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError 
     at javax.swing.table.DefaultTableColumnModel.getColumn(DefaultTableColumnModel.java:277) 
     at javax.swing.JTable.convertColumnIndexToModel(JTable.java:2553) 
     at javax.swing.JTable.getValueAt(JTable.java:2695) 
     at testprogram.guitest.TestTableModel$1.tableChanged(TestTableModel.java:63) 
     at javax.swing.table.AbstractTableModel.fireTableChanged(AbstractTableModel.java:280) 
     at javax.swing.table.AbstractTableModel.fireTableCellUpdated(AbstractTableModel.java:259) 
     at javax.swing.table.DefaultTableModel.setValueAt(DefaultTableModel.java:650) 
     at javax.swing.JTable.setValueAt(JTable.java:2719) 

Cualquier ayuda apreciada.

Respuesta

2

JTable.setValueAt provoca un evento de cambio de tabla para disparar, por lo que está llamando al controlador de eventos de forma repetida desde el controlador de eventos. Establezca el valor en el modelo, no en la tabla.

+3

Sé que esto es antiguo, pero quería señalar que esto no soluciona el problema porque el modelo de tabla se cambia si se usa el método setValueAt de la tabla o el método setValueAt del modelo. La respuesta de @ jaime debería al menos ser una respuesta aceptada. – mdscruggs

1

Está actualizando un valor en un controlador de eventos para las actualizaciones. Esto naturalmente disparará el controlador de eventos para ser llamado nuevamente. Lo cual disparará el controlador de eventos para ser llamado nuevamente, etc.

Tendría que quizás eliminar el oyente antes de hacer la actualización.

0

Me enfrentaba al mismo problema antes al usar jlist. Mi solución fue simplemente cambiar la secuencia de mis líneas de código.

  1. Obtenga todas las jpanel s que tienen imágenes.
  2. Añadir un oyente justo antes de añadir object[] a jlist

La cuestión anteriormente tuve (que estaba creando una stack-overflow error añadía al oyente a jlist primera, continuación conseguir todos los jpanel s con imágenes.

9

Desde el controlador de eventos (método tableChanged) envolver el código que hace uso del método setValue con código para eliminar y añadir el oyente, como este

public void tableChanged(TableModelEvent e) { 
model.removeTableModelListener(this); 
// YOUR CODE WITH setValueAt calls begins here 
if (ppt == null || cantidad > ppt.getStock()) { 

model.setValueAt(ppt != null ? ppt.getStock() : 0, e.getFirstRow(), 3); 
} 

model.setValueAt(precioUnitario * cantidad, e.getFirstRow(), 4); 

// YOUR CODE with setValueAt calls ends here 
model.addTableModelListener(this); 
} 

Esto deshabilitará temporalmente el oyente mientras trabaja en las validaciones.

+0

¡Impresionante! ¡Me ayudó mucho! – skiabox

Cuestiones relacionadas