To jest pytanie otwarte.
Dla mnie masz kilka opcji...
Możesz...
Aktualizuj bazę danych w czasie rzeczywistym w miarę zmiany danych w tabeli.
Wymagałoby to rozszerzenia TableModel
więc masz dostęp do setValue
metody, która pozwoliłaby nie tylko zaktualizować stan modelu, ale także zaktualizować stan bazy danych (zaktualizowałbym bazę danych i jak się powiedzie, zaktualizuję model, ale to ja) LUB podpiąć słuchacza do modelu i monitoruj odpowiednie TableChanged
zdarzenia i odpowiednio zaktualizuj bazę danych.
Chociaż wygląda to na fajną metodę, ryzykujesz „zawieszenie” interfejsu użytkownika, gdy baza danych jest aktualizowana lub brak synchronizacji z tym, co jest w modelu i tym, co jest w bazie danych...
Możesz...
Utwórz Class
reprezentujący dane z bazy danych. Kiedy wartość zostanie zmieniona w tym obiekcie, po prostu podniesiesz flagę informującą, że wiersz się zmienił.
Gdy użytkownik zakończy wprowadzanie zmian w danych tabeli, kliknie „zapisz”. Następnie przejdziesz przez wszystkie obiekty i określisz, które z nich wymagają aktualizacji, i „zapiszesz” je z powrotem w bazie danych.
Może to potencjalnie pozwolić na zapisanie „nieaktualnych” danych z powrotem do bazy danych (tj. Użytkownik A ładuje dane i zaczyna wprowadzać zmiany. Użytkownik B w międzyczasie ładuje dane, wprowadza zmiany i zapisuje je z powrotem w bazie danych. Następnie użytkownik A zapisuje swoje zmiany, nadpisując niektóre zmiany, które użytkownik B już zatwierdził)
Istnieją podejścia do rozwiązania obu, ale musisz zdecydować, które podejście najlepiej odpowiada Twojemu bieżącemu problemowi, aktualizacjom w czasie rzeczywistym lub opóźnionym...
Zaktualizowano o podstawowy przykład
Pierwszą rzeczą do zrobienia jest rozpoczęcie od stworzenia klasy, która reprezentuje dane z Twojej bazy danych. Normalnie zacząłbym od Interface
i użyj jakiejś fabryki, aby wygenerować rzeczywistą implementację, ale małymi krokami...
Ma jedną bardzo ważną zmienną, hasChanged
. Służy do oznaczania, że obiekt wymaga aktualizacji...
public class Person {
private boolean hasChanged = false;
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public boolean hasChanged() {
return hasChanged;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setFirstName(String value) {
if (value == null ? firstName != null : !value.equals(firstName)) {
firstName = value;
hasChanged = true;
}
}
public void setLastName(String value) {
if (value == null ? lastName != null : !value.equals(lastName)) {
lastName = value;
hasChanged = true;
}
}
}
Następnie zbudowaliśmy model tabeli zdolny do modelowania listy obiektów...
public class PeopleTableModel extends AbstractTableModel {
private List<Person> people;
public PeopleTableModel() {
people = new ArrayList<>(20);
}
public void addPerson(Person person) {
people.add(person);
fireTableRowsInserted(people.size() - 1, people.size() - 1);
}
public Person getPersonAt(int row) {
return people.get(row);
}
public List<Person> getChangedPeople() {
List<Person> changed = new ArrayList<>(people.size());
for (Person p : people) {
if (p.hasChanged()) {
changed.add(p);
}
}
return changed;
}
@Override
public int getRowCount() {
return people.size();
}
@Override
public String getColumnName(int column) {
String name = null;
switch (column) {
case 0:
name = "First name";
break;
case 1:
name = "First name";
break;
}
return name;
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Person p = people.get(rowIndex);
Object value = null;
switch (columnIndex) {
case 0:
value = p.getFirstName();
break;
case 1:
value = p.getLastName();
break;
}
return value;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (aValue instanceof String) {
Person p = people.get(rowIndex);
switch (columnIndex) {
case 0:
p.setFirstName(aValue.toString());
break;
case 1:
p.setLastName(aValue.toString());
break;
}
fireTableRowsUpdated(rowIndex, rowIndex);
}
}
}
Jest wiele sposobów na osiągnięcie tego samego, ale w zasadzie tutaj przedstawiłem metodę o nazwie getChangedPeople
co zwróci wszystkie People
które się zmieniły. Następnie wystarczy przejść przez tę listę i wywołać odpowiednią instrukcję aktualizacji bazy danych.