これは自由形式の質問です。
私にとって、あなたにはいくつかの選択肢があります...
できます...
テーブル内でデータが変更されたら、データベースをリアルタイムで更新します。
これには、TableModel
を拡張する必要があります したがって、setValue
にアクセスできます このメソッドを使用すると、モデルの状態を更新するだけでなく、データベースの状態も更新できます(データベースを更新し、成功した場合はモデルを更新しますが、それは私です)。またはリスナーをモデルにアタッチします。適切なTableChanged
を監視します イベントを実行し、それに応じてデータベースを更新します。
これは優れた方法のように見えますが、データベースの更新中にUIが「ハング」したり、モデルの内容やデータベースの内容と同期しなくなったりするリスクがあります...
できます...
Class
を作成します これは、データベースからのデータを表します。このオブジェクト内で値が変更されると、行が変更されたことを示すフラグを立てるだけです。
ユーザーがテーブルデータの変更を終えたら、[保存]をクリックします。次に、すべてのオブジェクトを調べて、更新する必要があるオブジェクトを特定し、それらをデータベースに「保存」します。
これにより、「古い」データをデータベースに書き戻すことができる可能性があります(つまり、ユーザーAがデータをロードして変更を開始します。その間に、ユーザーBがデータをロードして変更を加え、データベースに保存します。次に、ユーザーAは変更を保存し、ユーザーBがすでにコミットした変更の一部を上書きします)
両方を解決するためのアプローチがありますが、現在の問題に最も適したアプローチ、リアルタイムまたは遅延更新を決定する必要があります...
基本的な例で更新
最初に行うことは、データベースからのデータを表すクラスを作成することから始めます。通常、私はInterface
から始めます ある種のファクトリを使用して実際の実装を生成しますが、小さな手順です...
これには非常に重要な変数が1つあり、hasChanged
。これは、オブジェクトを更新する必要があることを示すために使用されます...
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;
}
}
}
次に、オブジェクトのリストをモデル化できるテーブルモデルを作成しました...
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);
}
}
}
同じことを実現する方法はいくつもありますが、基本的にここではgetChangedPeople
というメソッドを提供しました。 すべてのPeople
を返します 変わった。次に、このリストをループして、適切なデータベース更新ステートメントを呼び出します。