In meiner Anwendung verwende ich eine Java-Tabelle, die diesem Beispiel ähnlich ist . Mein Problem ist, wenn ich einen Wert einer Zelle ändere (selbst im obigen Beispiel), wird das Datenmodell nicht aktualisiert, bis ich auf eine andere Zelle klicke. Selbst wenn ich auf den grauen Bereich unterhalb der Tabelle klicke, ändert sich der Zellenwert, den das Modell nicht ändert. Ich denke, der Grund ist, dass die Zelle fokussiert bleibt, bis ich auf eine andere Zelle klicke. Wie kann ich dies vermeiden und das Modell aktualisieren, ohne auf die Tabellenzelle zu klicken? Vielen Dank im Voraus
Ich habe den obigen Beispielcode bearbeiten, um das Problem widerzuspiegeln
%Vor%Wenn Sie das Beispiel ausführen, können Sie den Tabelleninhalt im Textbereich unter der Tabelle sehen. Nachdem Sie eine Zelle aktualisiert haben, sollte sie in dem Textfeld darunter angezeigt werden. Aber 'setValueAt' Methode wird nicht aufgerufen, bis Sie auf eine andere Zelle klicken.
Der Standardaktualisierungsmechanismus ändert nur das Modell, wenn der Zelleneditor den Fokus verliert. Entweder wird ein Tabulator aus der Zelle heraus oder ein Klick in eine andere Zelle verursacht das wichtige Ereignis "Fokus verloren", das den Modellwechsel auslöst.
Ein Klick in den grauen Bereich hat keine Wirkung, da dort keine aktiven Elemente vorhanden sind, die das Ereignis verarbeiten könnten - die Tabelle ignoriert den Klick.
Wenn Sie dies ändern möchten, müssen Sie ein Ereignis finden, das dem Computer mitteilt, dass der Benutzer "fertig mit der Bearbeitung" ist. Wie kannst du das Wissen?
ActionListener
hinzufügen (siehe Ссылка ). Es wird ausgelöst, wenn Sie RETURN drücken. Rufen Sie im Handler fireEditingStopped()
auf, um den Code "Kopie zum Modell" auszulösen (siehe Ссылка ). Sie könnten eine "Speichern" -Schaltfläche unterhalb der Tabelle hinzufügen und diesen Code in seiner ActionListner
:
[BEARBEITEN] Beachten Sie, dass das Hinzufügen eines "Speichern" -Buttons den Editierfluss der Benutzer unterbrechen kann (Klicken Sie auf Tabellenzelle, bearbeiten Sie, greifen Sie die Maus, zielen Sie, klicken Sie auf Speichern, klicken Sie auf nächste Zelle, gehen Sie zurück zur Tastatur, bearbeiten, ...)
Das ist das erwartete Verhalten: Der bearbeitete Wert wird erst dann an das Backing-Modell übergeben, wenn eine explizite Benutzergeste wie z. Drücken Sie Enter oder Tab-out oder klicken Sie an einer anderen Stelle in der Tabelle ...
Eine Kuriosität (einige nennen es Bug :-) von JTable ist, dass die Bearbeitung nicht standardmäßig beendet wird, wenn der Fokus auf das "Äußere" der Tabelle übertragen wird. Um dies zu erzwingen, müssen Sie es wie folgt konfigurieren:
%Vor%BTW (nicht verwandt, nur aus Gründen der Vernunft): feuere immer den feinkörnigsten Ereignistyp, hier wäre ein cellUpdated anstelle des dataChanged-Hammers.
Tags und Links java swing jtable tablecelleditor