1

私の GUI には、SQL クエリをトリガーする可能性のある 1 つまたは複数のフォームが含まれていJTableます。それが起こるたびに、それに応じてテーブルを更新したいと思います。とリモート SQL テーブルの両方を更新する必要があるため、続行するにはいくつかの方法があります。INSERTUPDATEDELETETableModel

  • 最初に SQL テーブルを更新し、次にSELECT変更されたデータを更新して、 を呼び出しますfireTableDataChanged()これが私が現在行っていることです。テーブルとデータベースが完全に同期されていることが保証されます。ただし、TableModelデータが から抽出されるまで は更新されませんResultSet。私の場合、全体で平均 0.5 ~ 1 秒かかります。これはそれほど悪くはありませんが、良くもありません。

  • 両方を同時に更新し、TableModel以前の方法で期待されることと一致するように を変更します。これにより、クライアント側のパフォーマンスが向上する可能性があります。これは、変更がほぼ瞬時に行われ、SQL が「バックグラウンドで」実行されるためです。しかし、テーブルとデータベースの間の同期が失われることについて確信が持てません。これは汚い方法のようです。

  • これら 2 つの方法を組み合わせます。おそらく、迅速な単一セルの更新では 2 番目の方法を使用する必要がありますが、 INSERTs とDELETEs では最初の方法が必要でしょうか? より効率的ですが、一貫性がないように感じます。

  • 別の方法はありますか?

どのように進めればよいですか?この件についてあなたの経験を共有してください。

4

3 に答える 3

1
  1. 最初に SQL テーブルを更新し、次に変更されたデータを更新し、返された を使用しSELECTて新しいテーブルを作成します。TableModelResultSetこれが私が現在行っていることです。テーブルとデータベースが完全に同期されていることが保証されます。ただし、TableModelデータが から抽出されるまで は更新されませんResultSet。私の場合、全体で平均 0.5 ~ 1 秒かかります。これはそれほど悪くはありませんが、良くもありません。

    • 間違った考え 新しい XxxTableModel を作成することは逆効果ではありません。1 つの XxxTableModel をすべてのビューに使用できます。いくつかの JTables/JLists については注意が必要です1 つの XxxTableModel に基づくすべての JTable のソート

    • 個別の XxxTableModels を作成するための静的データ (StandingData) 用

  2. 両方を同時に更新し、TableModel以前の方法で期待されることと一致するように を変更します。これにより、クライアント側のパフォーマンスが向上する可能性があります。これは、変更がほぼ瞬時に行われ、SQL が「バックグラウンドで」実行されるためです。しかし、テーブルとデータベースの間の同期が失われることについて確信が持てません。これは汚い方法のようです。

    • 基本的に、入力マスク(フォーム)の値がデータベースに保存されている場合、JTableを更新し、入力フォームをデフォルト値で終了する必要があります

    • 方法かもしれませんが、データベース、JTable のそのミラー、および入力マスクを同期するために必要です

  3. これら 2 つの方法を組み合わせます。おそらく、迅速な単一セルの更新では 2 番目の方法を使用する必要がありますが、 INSERTs とDELETEs では最初の方法が必要でしょうか? より効率的ですが、一貫性がないように感じます。

    • am 3 points の文脈ではないかもしれません
  4. 別の方法はありますか?

    • はい、いくつかの方法がありますがMy GUI includes a JTable and several forms that may ...、単純なことを複雑にする可能性があります

    • で1つのJFrameを作成します

      1. JSplitPane と、CardLayout によって作成されたすべての入力マスク用の 1 つの領域、JTable 用の 2 番目、1 つの XxxTableModel を含む 1 つの JTable (JList に StandindData を追加するか、空き領域を埋める目的で南または西/東の領域に別の JTable を追加できます)コンテナに)

      2. BorderLayout を使用します。中央には、CardLayout によって配置された入力マスクがあります。上記のポイント 1 の残りを参照してください。

      3. いくつかの JTables/Lists (たとえば、Bloomberg または Reuters Xtra3000 の画面を参照) を 1 つの JFrame に追加し、JMenuItems を使用してこれらのオブジェクトに JPopupMenu を追加します。 1 つの JDialog が CardLayout によって配置され、アプリの起動時にすべての入力マスクが含まれます。JPopupMenu からの出力には、ソースに基づいてカードに切り替える 3 つのコード行が含まれます。JDialog のコール パック、JDialog の setVisible(true) の呼び出しですが、後で呼び出し、

      4. データがデータベースに保存された後、setVisible(false) が呼び出される前に、入力マスク内のすべての JComponents をリセットします。そうしないと、次の可視性が JComponent の値でフラッシュ/リフレッシュされます。

    • 定型入力からのデータがデータベースに正しく保存されていることを保証する人は誰もいません。

      1. たとえば、残りの列の値を埋めるトリガーを定義すると、すべてのデータフローが非同期になり、内部データベース ルールによって遅延する可能性があります。

      2. データ フローは、データをデータベースに保存する必要があります。PreparedStatement が例外なく実行された場合、入力マスクをデフォルト値に更新できます。次のステップは、データを XxxMableModel にロードすることです。ポップアップ JDialog がある場合は、今がその瞬間です。 JDialog を隠す

  5. 例外がある場合、入力マスクとその値では何も起こらず、ユーザーにとってより安全で安全であり、それに基づいてシミュレートすることができ、スクリーンショットを作成してから報告することができます....

于 2013-06-13T10:37:21.543 に答える
1

私の頭に浮かんだ最初のアプローチは、 のサブクラスを作成し、そのプライベートフィールドAbstractTableModelにデータを格納することです。ArrayList<?>そのコンストラクターで、テーブルに表示するデータを使用してデータベースにクエリを実行します。

行がテーブルに追加されるINSERTと、挿入されたデータを含むステートメントが DB に送信されます。

テーブル内のセルが更新された場合、更新が可能かどうかを検証します。可能であればUPDATE、DB に対して が起動されます

行が削除さDELETE FROMれると、DB に対してステートメントが発行されます。

public class MyTableModel extends AbstractTableModel{

    private List<Person> dataSource;

    public MyTableModel(){
        dataSource = new ArrayList<Person>();

        //query the database then add the queried data to the dataSource, 
        //you should do it in the background, using SwingWorker
        //call fireTableRowsInserted with proper arguments
    }
    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public int getRowCount() {
        return dataSource.size();
    }

    @Override
    public Object getValueAt(int row, int col) {
        Object retVal = null;

        if(col == 0)dataSource.get(row).getFirstName();
        else if(col == 1)dataSource.get(row).getLastName();
        else if(col == 2)dataSource.get(row).getOccupation();

        return retVal;
    }

    @Override
    public void setValueAt(Object value, int row, int col){
        //validate if the update is possible, if yes proceed
        //update the value in the DB
        //update the value in the arraylist
        //call super.setValueAt(value, row, col);
    }

    public void addRow(Person p){
        //validate if the person is insertable, if yes proceed
        //INSERT the person to the DB
        //add the person to the arraylist
        //call fireTableRowsInserted
    }

    public void deleteRow(int row){
        //call fireTableRowsDeleted
    }
}
于 2013-06-13T10:09:09.960 に答える