2

データベーステーブルをJTableとして表示したい。私はこれまでJTableを使用したことがないので、JTableとTableModelをグーグルで検索しました。

そのグーグルで、私はに保存されたデータを表示する独自のカスタムTableModelを書くことができます

Object[][] data;

次に、データベーステーブルのデータをJTableに表示します。私もそれを検索し、それについての考えを持っていますが、AbstractTableModelの実装クラスのどこに何をすべきかについてまだ混乱しています。

以下は、カスタムTableModelのコードです。

public abstract class AbstractPOLDATTableModel extends AbstractTableModel {
protected boolean DEBUG = false;
private String[] columnNames;
private Object[][] data;

protected AbstractPOLDATTableModel(String[] columnNames, Object[][] data) {
    this.columnNames = columnNames;
    this.data = data;
}

public int getColumnCount() {
    return columnNames.length;
}

public int getRowCount() {
    return data.length;
}

@Override
public String getColumnName(int col) {
    return columnNames[col];
}

public Object getValueAt(int row, int col) {
    return data[row][col];
}

@Override
public Class getColumnClass(int c) {
    return getValueAt(0, c).getClass();
}

@Override
public boolean isCellEditable(int row, int col) {
    if (col < 2) {
        return false;
    } else {
        return true;
    }
}

@Override
public void setValueAt(Object value, int row, int col) {
    if (DEBUG) {
        System.out.println("Setting value at " + row + "," + col
                           + " to " + value
                           + " (an instance of "
                           + value.getClass() + ")");
    }

    data[row][col] = value;
    fireTableCellUpdated(row, col);

    if (DEBUG) {
        System.out.println("New value of data:");
        printDebugData();
    }
}

private void printDebugData() {
    int numRows = getRowCount();
    int numCols = getColumnCount();

    for (int i=0; i < numRows; i++) {
        System.out.print("    row " + i + ":");
        for (int j=0; j < numCols; j++) {
            System.out.print("  " + data[i][j]);
        }
        System.out.println();
    }
    System.out.println("--------------------------");
}
}

次に、上記のコードを変更して、JTableに次の機能を持たせる方法を説明します。

  1. データベースからのデータを表示します
  2. ユーザーはテーブルを直接編集でき、「保存」ボタンをクリックすると、変更がデータベースデータに反映されます。
  3. ユーザーはデータを直接挿入できます。
  4. ユーザーはデータを直接削除できます。
4

1 に答える 1

1

前の質問で Adamski が提案したことに従って、1 を実装したと仮定しています。また、Sanoj が提案したように、ある種のリストを使用してデータを保存するように変更してください。

  1. 2-4 をサポートするには、データベースから引き出すデータが 1 つのテーブルのみから取得され、派生データ (集計、列 1 + 列 2 など) が含まれていないことを確認する必要があります。whereユーザーが行をフィルタリングできるようにする場合は、句を追跡する必要があります。

  2. 各行内に、ユーザーが GUI を使用して行った更新を表す別の行 (updatedRow と呼びましょう) を格納します。行が更新されたら、更新されたデータを含む新しい行をこのフィールドに入力する必要があります。[保存] をクリックすると、null 以外の updatedRow を持つすべての行に対して更新クエリを実行し、元の行のデータと一致しない updatedRow のデータでデータベースを更新します (ユーザーがデータを元の方法に戻した場合は更新しないでください)。もともとでした)。null 以外の updatedRow を持つすべての行の元のデータをテーブルに入力する別の [更新を元に戻す] ボタンがある場合もあります。

    主キーを形成するフィールドに追加のメタデータを保存し、それらが変更されないようにすることを強くお勧めします。そのような列の更新にはコストがかかる可能性があるためです (おそらくインデックスが作成され、いくつかの RI 制約が付加されている可能性があるため)。このような列を編集不可にすることで、これを GUI に反映する必要があります。更新のwhere句は、すべてのフィールドではなく、これらのフィールドのみを使用します (ユーザーが 1 で設定した他のフィルターが必要になります)。

  3. 2段階のプロセスをお勧めします。ユーザーは、テーブルに行を追加するボタンをクリックして開始します。データを入力した後、ユーザーは別のボタンをクリックしてデータベースに挿入します (または、この機能を「保存」ボタンの更新と組み合わせることができます)。主キー列が自動生成された ID でない場合は、新しく挿入された行に対して主キー フィールドを編集できるようにする必要があります。

    既にデータベースにある行とそうでない行を区別するには、新しく挿入された行のリストを保存することをお勧めします。

    ユーザーがテーブルに表示する特定の列のみを選択できるようにする場合、表示されていない列を処理する方法を決定する必要があります (たとえば、データベースにデフォルトを設定させ、自動生成された ID を入力させます)。

  4. おそらく、各行にチェックボックスを配置してこれを実装するのが最善です。次に、[削除] ボタンをクリックすると、SQL を呼び出して、1 のフィルターと 2 で説明した主キー メタデータを使用して、チェックされた各行を削除し、それを削除します。テーブルから。

一般的な考慮事項:

  • 更新された行と挿入された行の両方に同じ setValueAt メソッドが使用されますが、異なる動作が必要です。更新のために updatedRow を設定する必要がありますが、挿入しようとしている行を編集するときは設定しません。

  • 制約が満たされていない、または無効な入力 (数値フィールドの「abcde」など) などのエラーをどのように処理しますか?

  • SQL インジェクション。

于 2010-02-04T23:37:49.603 に答える