Cómo hacer una verificación antes de permitir la edición de una fila dada en un JTable

StackOverflow https://stackoverflow.com/questions/246395

  •  05-07-2019
  •  | 
  •  

Pregunta

El problema es bastante básico. Tengo un JTable que muestra datos en caché de una base de datos. Si un usuario hace clic en una celda para editar, quiero intentar bloquear esa fila en la base de datos. Si el bloqueo no tiene éxito, quiero evitar la edición.

Pero parece que no puedo encontrar una manera limpia de lograr esto. ¿Me estoy perdiendo algo?

¿Fue útil?

Solución

Debido a que tiene que probar con el clic, no puede usar la forma del modelo de hacer esto, por lo que debe intentar anular el public void changeSelection (int rowIndex, int columnIndex, boolean toggle, oolean extend) . Si la fila está bloqueada, no llame a super.changeSelection y debería dejar la fila sin seleccionar.

Otros consejos

Antes de editar / establecer el valor, se le pregunta al modelo de tabla a través de TableModel.isCellEditable (row, col) si esta celda es editable. Aquí puede implementar su bloqueo. y después de TableModel.setValue (row, col, val) debes desbloquear esto. PERO. La operación de bloqueo debe llevar mucho tiempo y hace que su IU no sea responsable. Y si es MALO. Probar un enfoque diferente. ¿Qué pasa con el vago fracaso? Bloquea la fila, verifica la validez de los datos y falla si los datos son más nuevos. Si los datos están bien, los pones abajo. DESBLOQUEAR.

Oracle tiene una buena manera de manejar esto, pero no sé cuán universalmente aplicable es.

En Oracle, puede utilizar PARA ACTUALIZAR en una declaración SELECT para bloquear un registro mientras lo lee.

Por ejemplo, si está buscando una fila para mostrar:

select * into v_row from my_table where my_table_id = 1
for update;

Esto permitirá lecturas pero evitará actualizaciones. Si otra transacción tiene un bloqueo, la transacción esperará hasta que esté disponible (o se agote el tiempo de espera, eventualmente). Si desea que la declaración arroje una excepción si intenta bloquear, agregue NOWAIT .

select * into v_row from my_table where my_table_id = 1
for update nowait;

Si la fila ya está bloqueada, obtendrás:

ORA-00054: resource busy and acquire with NOWAIT specified.

Espero que ayude.

En su lugar, podría esperar hasta que el usuario realmente cambie algo, luego invalide JTable.editingStopped para hacer el trabajo allí (incluso podría verificar si el valor cambió)

De esa manera no se realiza ningún bloqueo hasta que el usuario realmente cambie algo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top