Esta é uma pergunta aberta.
Para mim, você tem algumas opções...
Você poderia...
Atualize o banco de dados em tempo real à medida que os dados são alterados na tabela.
Isso exigiria que você estendesse o
TableModel
então você tem acesso ao setValue
método, que permitiria não apenas atualizar o estado do modelo, mas também atualizar o estado do banco de dados (eu atualizaria o banco de dados e, quando bem-sucedido, atualizaria o modelo, mas sou eu) OU anexar um ouvinte ao modelo e monitore para TableChanged
apropriado eventos e atualize o banco de dados de acordo. Embora isso pareça um bom método, você corre o risco de "pendurar" a interface do usuário enquanto o banco de dados é atualizado ou ficar fora de sincronia com o que está no modelo e o que está no banco de dados...
Você poderia...
Crie uma
Class
que representa os dados do banco de dados. Quando um valor é alterado dentro desse objeto, você simplesmente levanta um sinalizador informando que a linha foi alterada. Quando o usuário terminar de fazer as alterações nos dados da tabela, ele clicará em "salvar". Você então percorreria todos os objetos e determinaria quais precisam ser atualizados e os "salvaria" de volta ao banco de dados.
Isso tem o potencial de permitir que dados "antigos" sejam gravados de volta no banco de dados (ou seja, o usuário A carrega os dados e começa a fazer alterações. O usuário B, enquanto isso, carrega os dados, faz alterações e os salva de volta no banco de dados. O usuário A salva suas alterações, substituindo algumas das alterações que o usuário B já confirmou)
Existem abordagens para resolver ambos, mas você precisa decidir qual abordagem melhor se adapta ao seu problema atual, atualizações em tempo real ou atrasadas...
Atualizado com exemplo básico
A primeira coisa a fazer é começar criando uma classe que representa os dados do seu banco de dados. Normalmente, eu começaria com uma
Interface
e usar algum tipo de fábrica para gerar a implementação real, mas pequenos passos... Isso tem uma variável muito importante,
hasChanged
. Isso é usado para sinalizar que o objeto precisa ser atualizado ... 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;
}
}
}
Em seguida, construímos um modelo de tabela capaz de modelar uma lista de objetos...
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);
}
}
}
Existem várias maneiras de conseguir a mesma coisa, mas basicamente aqui eu forneci o método chamado
getChangedPeople
que retornará todas as People
que mudaram. Em seguida, você simplesmente percorreria essa lista e chamaria a instrução de atualização de banco de dados apropriada.