Como fazer uma verificação antes de permitir a edição de uma determinada linha em uma JTable

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

  •  05-07-2019
  •  | 
  •  

Pergunta

O problema é muito básico. Eu tenho um conjunto de dados mostrando JTable em cache de um banco de dados. Se um usuário clicar em uma célula para edição, eu quero tentar um bloqueio nessa linha no banco de dados. Se o bloqueio não for bem sucedido, eu quero evitar a edição.

Mas eu não consigo encontrar qualquer maneira limpa para fazer isso. Estou faltando alguma coisa?

Foi útil?

Solução

Porque você tem que teste no clique você não pode usar o caminho do modelo de fazer isso para que você deve tentar substituir o JTable changeSelection public void (int rowIndex, int columnIndex, boolean alternância, oolean estender) método . Se a linha estiver bloqueado, então não chamar super.changeSelection e deve deixar a linha não selecionadas.

Outras dicas

Antes de edição / valor definindo o modelo de mesa é feita via TableModel.isCellEditable (linha, col) se esta célula é editável. Aqui você pode implementar o seu bloqueio. e depois de TableModel.setValue (linha, col, val) você deve desbloquear este. MAS. A operação de bloqueio deve ter um monte de tempo e torna a sua UI un-responsável. E si BAD. Tente abordagem diferente. E quanto preguiçoso falhar? Você bloquear a linha, verificar a validade dos dados e falhar se os dados são mais recentes. Se os dados são OK, você colocá-los para baixo. UNLOCK.

A Oracle tem uma boa maneira de lidar com isso, mas eu não sei como universalmente aplicável é.

No Oracle, você pode usar FOR UPDATE em uma instrução SELECT para bloquear um registro como você lê-lo.

Por exemplo, se você está buscando uma linha para display:

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

Isso permitirá que lê, mas impedir atualizações. Se outra transação tem um bloqueio de sua transação esperar até que ele se torna disponível (ou tempo limite, eventualmente). Se você quer a declaração para lançar uma exceção se você tentar bloquear você adicionar NOWAIT .

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

Se a linha já está bloqueado você vai ter:

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

Espero que ajude.

Em vez disso, você poderia esperar até que o usuário realmente muda alguma coisa, então substituir JTable.editingStopped para fazer o trabalho lá (você pode até mesmo verificar para ver se o valor alterado)

Dessa forma, nenhum bloqueio é feito até que o usuário realmente muda alguma coisa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top