Wie eine Überprüfung zu tun, bevor die Bearbeitung einer bestimmten Zeile in einer JTable erlaubt

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

  •  05-07-2019
  •  | 
  •  

Frage

Das Problem ist recht einfach. Ich habe eine JTable aus einer Datenbank im Cache gespeicherten Daten zeigt. Wenn ein Benutzer in einer Zelle für die Bearbeitung klickt, mag ich in dieser Zeile in der Datenbank eine Sperre versuchen. Wenn die Sperre nicht erfolgreich ist, möchte ich die Bearbeitung verhindern.

Aber ich kann nicht scheinen, jede saubere Art und Weise zu finden, dies zu erreichen. Bin ich etwas fehlt?

War es hilfreich?

Lösung

Weil Sie auf die testen klicken Sie nicht das Modell der Art und Weise, dies zu tun verwenden können, so sollten Sie versuchen, die public void changeSelection (int rowIndex, int column, boolean Toggle, erweitern oolean) Verfahren. Wenn die Zeile gesperrt ist dann nicht super.changeSelection nennen, und es sollte die Zeile nicht aktivieren.

Andere Tipps

Vor der Bearbeitung / Einstellungswert das Tischmodell wird über TableModel.isCellEditable gefragt (Zeile, Spalte), ob diese Zelle bearbeitet werden kann. Hier können Sie Ihre Sperre implementieren. und nach TableModel.setValue (row, col, val) sollten Sie diese entsperren. ABER. Der Sperrvorgang sollte viel Zeit in Anspruch nehmen und macht die UI un-verantwortlich. Und es si BAD. Versuchen Sie anderen Ansatz. Was ist faul scheitern? Sie sperren die Zeile, überprüfen die Gültigkeit der Daten und fehlschlagen, wenn Daten neuer sind. Wenn die Daten in Ordnung sind, setzen Sie sie auf. UNLOCK.

Oracle hat eine nette Art und Weise des Umgangs mit diesem, aber ich weiß nicht, wie universell einsetzbar ist.

In Oracle können Sie FOR UPDATE auf eine SELECT-Anweisung einen Datensatz zu sperren, wie Sie es lesen.

Zum Beispiel, wenn Sie eine Zeile für die Anzeige holen:

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

Dies ermöglicht es liest, aber Updates zu verhindern. Wenn eine andere Transaktion eine Sperre hat Ihre Transaktion wartet, bis sie verfügbar sind (oder Timeout, schließlich). Wenn Sie wollen, dass die Anweisung eine Ausnahme ausgelöst, wenn Sie zu sperren versuchen, fügen Sie NOWAIT .

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

Wenn die Zeile bereits gesperrt ist Sie erhalten:

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

Ich hoffe, das hilft.

Stattdessen könnten Sie warten, bis der Benutzer tatsächlich etwas ändert, dann JTable.editingStopped außer Kraft setzen, die Arbeit dort zu tun (Sie selbst überprüfen, könnten, wenn der Wert geändert)

auf diese Weise keine Verriegelung, bis der Benutzer tatsächlich etwas ändert gemacht wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top