Toto je otevřená otázka.
Pro mě máte několik možností...
Mohl byste...
Aktualizujte databázi v reálném čase, jak se data v tabulce mění.
To by vyžadovalo, abyste buď rozšířili TableModel
takže máte přístup k setValue
metoda, která by vám umožnila nejen aktualizovat stav modelu, ale také aktualizovat stav databáze (já bych aktualizoval databázi a když se to podaří, aktualizuji model, ale to jsem já) NEBO připojit k modelu posluchače a sledovat vhodné TableChanged
události a podle toho aktualizujte databázi.
I když to vypadá jako hezká metoda, riskujete, že se uživatelské rozhraní „zasekne“ během aktualizace databáze nebo že se nesynchronizujete s tím, co je v modelu a co je v databázi...
Mohl byste...
Vytvořte Class
který představuje data z databáze. Když se v tomto objektu změní hodnota, jednoduše byste zvýšili příznak oznamující, že se řádek změnil.
Když uživatel dokončí změny v datech tabulky, klikne na „uložit“. Poté byste prošli všechny objekty a určili, které z nich je třeba aktualizovat, a "uložili" je zpět do databáze.
To má potenciál umožnit zapsání „zastaralých“ dat zpět do databáze (tj. Uživatel A načte data a začne provádět změny. Uživatel B mezitím načte data, provede změny a uloží je zpět do databáze. Uživatel A poté uloží své změny a přepíše některé změny, které uživatel B již provedl)
Existují přístupy k řešení obou, ale musíte se rozhodnout, který přístup nejlépe vyhovuje vašemu aktuálnímu problému, aktualizace v reálném čase nebo zpožděné aktualizace...
Aktualizováno o základní příklad
První věc, kterou musíte udělat, je začít vytvořením třídy, která představuje data z vaší databáze. Normálně bych začal Interface
a použít nějakou továrnu ke generování skutečné implementace, ale malé kroky...
To má jednu velmi důležitou proměnnou, hasChanged
. Toto se používá k označení objektu, který potřebuje aktualizaci...
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;
}
}
}
Dále jsme vytvořili tabulkový model schopný modelovat seznam objektů...
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);
}
}
}
Existuje mnoho způsobů, jak dosáhnout stejné věci, ale v zásadě jsem zde uvedl metodu nazvanou getChangedPeople
což vrátí všechny People
které se změnily. Pak byste jednoduše procházeli tímto seznamem a zavolali příslušné prohlášení o aktualizaci databáze.