jtable에서 주어진 행을 편집하기 전에 수표를 수행하는 방법

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

  •  05-07-2019
  •  | 
  •  

문제

문제는 매우 기본적입니다. 데이터베이스에서 캐시 된 데이터를 보여주는 jtable이 있습니다. 사용자가 편집을 위해 셀을 클릭하면 데이터베이스의 해당 행에 잠금을 시도하고 싶습니다. 잠금 장치가 성공하지 못하면 편집을 방지하고 싶습니다.

그러나 나는 이것을 달성 할 깨끗한 방법을 찾을 수없는 것 같습니다. 내가 뭔가를 놓치고 있습니까?

도움이 되었습니까?

해결책

클릭을 테스트해야하기 때문에 모델의이 작업을 수행 할 수 없으므로 JTable 's를 재정의하려고합니다. 공개 void 변경 선택 (Int RowIndex, Int ColumnIndex, Boolean 토글, Oolean Extend) 방법. 행이 잠겨 있으면 Super.Changeselection을 호출하지 않으면 행을 선택하지 않아야합니다.

다른 팁

편집/설정 값 값을 값에 맞춰 테이블 모델은 TableModel.iscelledable (Row, Col)을 통해이 셀이 편집 할 수 있는지 여부를 묻습니다. 여기에서 잠금 장치를 구현할 수 있습니다. 그리고 TableModel.setValue (Row, Col, Val) 이후에 잠금을 해제해야합니다. 하지만. 잠금 작업은 많은 시간이 걸리고 UI가 책임을지지 않습니다. 그리고 그것은 나쁘다. 다른 접근법을 시도하십시오. 게으른 실패는 어떻습니까? 행을 잠그고 데이터의 유효성을 확인하고 데이터가 더 적은 경우 실패합니다. 데이터가 정상이면 내려 놓습니다. 터놓다.

Oracle은 이것을 처리하는 좋은 방법을 가지고 있지만 보편적으로 어떻게 적용되는지 모르겠습니다.

오라클에서는 사용할 수 있습니다 업데이트를 위해 읽을 때 레코드를 잠그는 선택 문서에서.

예를 들어, 디스플레이를 위해 행을 가져 오는 경우 :

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

이렇게하면 읽기가 허용되지만 업데이트를 방지합니다. 다른 트랜잭션이 잠금이있는 경우 거래가 가능할 때까지 (또는 타임 아웃) 대기합니다. 문을 잠그려고하면 진술이 예외를 던지기를 원한다면 추가 Nowait.

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

행이 이미 잠겨 있으면 다음을 얻을 수 있습니다.

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

도움이되기를 바랍니다.

대신, 사용자가 실제로 무언가를 변경할 때까지 기다린 다음 JTable.editingStopped에서 작업을 수행하여 작업을 수행 할 수 있습니다 (값이 변경된 지 확인할 수도 있음).

그렇게하면 사용자가 실제로 무언가를 변경할 때까지 잠금을 수행하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top