Dette er et åbent spørgsmål.
For mig har du et par muligheder...
Du kunne...
Opdater databasen i realtid, efterhånden som dataene ændres i tabellen.
Dette kræver, at du enten udvider TableModel
så du har adgang til setValue
metode, som giver dig mulighed for ikke kun at opdatere modellens tilstand, men også opdatere databasens tilstand (jeg ville opdatere databasen, og når det lykkedes, opdatere modellen, men det er mig) ELLER knytte en lytter til modellen og overvåg for passende TableChanged
begivenheder og opdatere databasen i overensstemmelse hermed.
Selvom dette ligner en god metode, risikerer du at "hænge" brugergrænsefladen, mens databasen er blevet opdateret eller at komme ud af sync med, hvad der er i modellen og hvad der er i databasen...
Du kunne...
Opret en Class
der repræsenterer data fra databasen. Når en værdi er ændret i dette objekt, vil du blot hæve et flag, der angiver, at rækken er ændret.
Når brugeren er færdig med at foretage ændringer i tabeldataene, klikker de på "gem". Du vil derefter gå gennem alle objekterne og bestemme, hvilke der skal opdateres og "gemme" dem tilbage til databasen.
Dette har potentialet til at tillade "gamle" data at blive skrevet tilbage til databasen (dvs. Bruger A indlæser dataene og begynder at foretage ændringer. Bruger B indlæser i mellemtiden dataene, foretager ændringer og gemmer dem tilbage til databasen. Bruger A gemmer derefter deres ændringer og overskriver nogle af de ændringer, som bruger B allerede har foretaget)
Der er tilgange til at løse begge dele, men du skal beslutte, hvilken tilgang du bedst passer til dit nuværende problem, realtids- eller forsinkede opdateringer...
Opdateret med grundlæggende eksempel
Den første ting at gøre er at starte med at oprette en klasse, der repræsenterer dataene fra din database. Normalt ville jeg starte med en Interface
og brug en form for fabrik til at generere den faktiske implementering, men små trin...
Dette har en meget vigtig variabel, hasChanged
. Dette bruges til at markere, at objektet skal opdateres...
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;
}
}
}
Dernæst byggede vi en tabelmodel, der er i stand til at modellere en liste over objekter...
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);
}
}
}
Der er et vilkårligt antal måder at opnå det samme på, men grundlæggende her har jeg givet en metode kaldet getChangedPeople
som vil returnere alle People
der har ændret sig. Du vil derefter blot gå gennem denne liste og kalde den relevante databaseopdateringserklæring.