Breve descripción de un problema.Interactuando con JTable que se actualiza rápidamente con filas nuevas
Supongamos que JTable y el usuario interactúan con él de alguna manera. TableModel de esta tabla cambia constantemente. Cómo garantizar que cuando el usuario intente obtener información de la tabla al hacer referencia a una columna constante y la fila actualmente seleccionada (por su rowIndex que obtuvo de JTable), no entrará en una situación cuando TableModel se modifique y su rowIndex obtenido de JTable sea ya no corresponde al mismo valor en TableModel.
A continuación se pregunta inicial que explica problema con más detalle:
Considere siguiente situación:
No es JTable que muestra información del usuario acerca de que se están ejecutando las solicitudes en algún sistema
Cuando la nueva solicitud ingresa al sistema, se agrega una nueva fila a la tabla
usuario puede interactuar con la tabla haciendo clic derecho en una fila (modelo de una sola fila de selección se utiliza en la tabla) y la opción de elegir del menú (como: abortar, posponer, reintentar, etc.)
existe separada clase que implementa la interfaz ActionListener (escucha la tabla) y maneja todas las interacciones del usuario
Cuando el usuario realiza alguna acción en la tabla, esta clase verifica la fila seleccionada actualmente y asigna algunos valores para la acción del usuario (básicamente toma el índice de la fila seleccionada y luego llama a tableModel.getValueAt (indexOfSelectedRow, someValuableDataColumnIndex))
Considere ahora el escenario cuando el sistema está en prueba de esfuerzo y las solicitudes se envían constantemente con gran frecuencia. Esto, en mi caso, conduce a un error, cuando a veces la clase que maneja las acciones del usuario obtiene información incorrecta del modelo de la tabla (se invocó una acción en una fila, pero la acción se realiza para otra, generalmente la siguiente). Creo que esto sucede porque durante algunos pasos en la acción, el modelo de tabla de clase de manejo se cambia debido a la nueva solicitud aceptada.
La pregunta es, cómo solucionar esto. Estoy pensando en dos enfoques:
usar algo como invokeAndWait() para la inicialización en la clase de manejo de mis acciones de usuario (no me gusta esta idea, debido a la OMI que dará lugar a otros errores impredecibles)
creando una clase de escucha separada que escuchará las selecciones de los usuarios en la tabla y almacenará los datos de la fila seleccionada tan pronto como se haya seleccionado por separado de TableModel. De esta forma, las acciones que manejan clases tomarán datos no del modelo de tabla que se está modificando, sino de la fila seleccionada, que es constante durante el escenario descrito. (no estoy seguro de que esta idea funcione)
Por favor, comenta mis ideas y sugiere las tuyas.
Lamento la ausencia de código aquí, pero el código original ocupará demasiado espacio, y el ejemplo del modelo no es algo que se pueda hacer fácilmente aquí.
Después de pensar un poco acerca de mi segunda idea me di cuenta que no funcionará. Tiene los mismos dos pasos: 1) obtener el índice de fila seleccionado 2) obtener información del modelo de tabla para una fila con ese índice. Cualquier nueva fila que aparezca en la tabla en el medio de esos dos pasos arruinará las cosas. – GrayR
¿Cuántos subprocesos tienen acceso al 'TableModel'? Si hay más de uno, ¿cómo sincronizan el acceso? Ver también esto [sscce] (http://stackoverflow.com/a/7519403/230513) y este [Q & A] (http://stackoverflow.com/q/7787998/230513). – trashgod
@trashgod Se accede a TableModel por un solo hilo. También gracias por los enlaces, información interesante. No se puede encontrar nada útil a partir de ahora, pero seguramente lo investigará más a fondo. – GrayR