JTableの特定の行の編集を許可する前にチェックを行う方法
質問
問題は非常に基本的です。データベースからキャッシュされたデータを表示するJTableがあります。ユーザーが編集のためにセルをクリックした場合、データベース内のその行でロックを試行します。ロックが成功しない場合、編集を禁止したい。
しかし、これを達成するための明確な方法を見つけることができないようです。何か不足していますか?
解決
クリックでテストする必要があるため、モデルのこれを行う方法は使用できないため、JTableの public void changeSelection(int rowIndex、int columnIndex、boolean toggle、oolean extend)メソッド。行がロックされている場合は、super.changeSelectionを呼び出さないでください。行は選択されないままにしておく必要があります。
他のヒント
値を編集/設定する前に、TableModel.isCellEditable(row、col)を介して、このセルが編集可能かどうかをテーブルモデルに尋ねます。ここでロックを実装できます。 TableModel.setValue(row、col、val)の後、これをロック解除する必要があります。しかし。ロック操作には時間がかかり、UIが責任を負いません。そして、それは悪いです。別のアプローチを試してください。遅延フェイルはどうですか?行をロックし、データの有効性を確認し、データが新しい場合は失敗します。データに問題がなければ、それらを記録します。ロック解除。
Oracleにはこれを処理する優れた方法がありますが、それがどの程度一般的に適用できるかはわかりません。
Oracleでは、SELECTステートメントで FOR UPDATE を使用して、読み取り中にレコードをロックできます。
たとえば、表示のために行をフェッチする場合:
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をオーバーライドしてそこで作業を行うことができます(値が変更されたかどうかを確認することもできます)
この方法では、ユーザーが実際に何かを変更するまでロックは行われません。