Ini adalah pertanyaan terbuka.
Bagi saya, Anda memiliki beberapa pilihan...
Anda Bisa...
Perbarui database secara real time saat data diubah di dalam tabel.
Ini akan mengharuskan Anda untuk memperluas TableModel
jadi Anda memiliki akses ke setValue
metode, yang memungkinkan Anda tidak hanya memperbarui status model, tetapi juga memperbarui status basis data (saya akan memperbarui basis data dan ketika berhasil, memperbarui model, tetapi itu saya) ATAU melampirkan pendengar ke model dan pantau TableChanged
yang sesuai acara dan perbarui database yang sesuai.
Meskipun ini terlihat seperti metode yang bagus, Anda berisiko "menggantung" UI saat database diperbarui atau tidak sinkron dengan apa yang ada di model dan apa yang ada di database...
Anda Bisa...
Buat Class
yang mewakili data dari database. Saat nilai diubah dalam objek ini, Anda cukup menaikkan bendera yang menyatakan bahwa baris telah berubah.
Ketika pengguna telah selesai melakukan perubahan pada data tabel, mereka akan mengklik "simpan". Anda kemudian akan menelusuri semua objek dan menentukan mana yang perlu diperbarui dan "menyimpan" kembali ke database.
Ini memiliki potensi untuk memungkinkan data "basi" ditulis kembali ke database (yaitu Pengguna A memuat data dan mulai membuat perubahan. Sementara itu, Pengguna B memuat data, membuat perubahan, dan menyimpannya kembali ke database. Pengguna A kemudian menyimpan perubahannya, menimpa beberapa perubahan yang telah dilakukan Pengguna B)
Ada pendekatan untuk menyelesaikan keduanya, tetapi Anda perlu memutuskan pendekatan mana yang paling sesuai dengan masalah Anda saat ini, pembaruan waktu nyata atau tertunda...
Diperbarui dengan contoh dasar
Hal pertama yang harus dilakukan adalah mulai dengan membuat kelas yang mewakili data dari database Anda. Biasanya, saya akan mulai dengan Interface
dan menggunakan beberapa jenis pabrik untuk menghasilkan implementasi yang sebenarnya, tetapi langkah-langkah kecil...
Ini memiliki satu variabel yang sangat penting, hasChanged
. Ini digunakan untuk menandai objek yang perlu diperbarui...
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;
}
}
}
Selanjutnya kita membangun model tabel yang mampu memodelkan daftar objek...
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);
}
}
}
Ada beberapa cara untuk mencapai hal yang sama, tetapi pada dasarnya di sini saya telah menyediakan metode yang disebut getChangedPeople
yang akan mengembalikan semua People
yang telah berubah. Anda kemudian cukup mengulang daftar ini dan memanggil pernyataan pembaruan basis data yang sesuai.