3

多数の行を返すデータベース クエリがあります。JDBC戻ってくる行数はわかりません。また、行数が多すぎてJTable.

したがって、私が扱っているモデルは ですIterable<R>が、残念ながら、TableRowModel行数を事前に知っておく必要があります。

うまくいくかもしれないいくつかの戦略を想像できます:

  • すべての行をロードしますが、バックグラウンドで実行し、バッチでモデルに追加します。
  • どういうわけか(私が推測するモデルを介して)下位の行をレンダリングするリクエストを検出し、これが発生した場合はより多くの行を動的にロードします。
  • より多くの行を明示的にロードするためのボタンを画面に表示します。
  • 行数を事前に知らなくても行のレンダリングをサポートするある種のnon-JTableコンポーネント (理想的ですが、見つかりません)。

これを行う「通常の」方法があるかどうか疑問に思っています.UIでこの種のものを見ることはめったにないからです。私が調べたいくつかのJDBCツール (これらが最善の策だと思いました) は、結果を熱心にロードするか、ページングするように見えます (ユーザーとして、私は GUI アプリでのページングが本当に嫌いなので、それを避けたいと思います)。

ただし、テーブルに対する「検索」などの操作は、理想的には「わかりやすい」方法で機能する必要があります...したがって、これはあまり簡単ではないようです。

4

2 に答える 2

3

SwingWorkerの実装でa を使用しますAbstractTableModel。妥当な数のレコードがすぐに利用可能になり、残りはバックグラウンドで読み取られるように、ワーカーがクエリを分割します。a を使用しPropertyChangeListenerて進行状況を表示し、キャンセル ボタンを実装します。

于 2013-01-22T10:59:44.223 に答える
1

2 つの可能性があります。

  1. テーブルがモデルにない行を表示したい場合は、行数を返すクエリを作成し、データベースから行をロードしようとするテーブルモデルを実装します。この場合、行をインデックス ベースでロードできる 3 番目のクエリが必要です (これらのクエリは MS-SQL と Oracle で可能です)。例: 最初の 100 行と結果の数をロードします。テーブル モデルが位置 100 から 199 までの行を要求された場合、これらの行間隔をロードする新しいクエリを作成するか (データベースで可能な場合)、結果セットを反復処理して次のデータ バッチをロードしようとします。ただし、ユーザーが「End」キーを押した場合は、インデックス ベースの読み込みが必要です (または、完全な結果セットを反復処理する必要があります)。
  2. 最初のバッチ (たとえば 100 行) を示すモデルを記述します。ユーザーがスクロールして最後の行を表示する場合 (model.getValueAt(row, col) -> col == 99)、次のバッチの結果セットを要求し、新しい行をモデルに追加するだけです。

最初のバリアントはユーザーにとっては優れていますが (ユーザーはテーブルの大きさを確認でき、最後の行に直接スクロールできるため)、2 番目のバリアントは行のインデックス ベースのロードを必要としないため、実装が簡単です。

于 2013-01-22T07:47:16.610 に答える