2

シナリオ:

カスタム TableModel で JTable を使用して、データベースやネットワークなどにあるコレクションの内容を表示しています。

これを機能させる強引な方法は、コレクション全体を一度にロードすることです。必要なリソースのために、それは実用的ではないとしましょう。

この問題を回避する簡単な方法は、JTable が各行をレンダリングし、TableModel.getValueAt(); を呼び出すときに、必要に応じて一度に 1 行ずつ行をフェッチすることです。必要に応じてキャッシュします。ただし、これにより、データベースに多くのヒットが発生します。

各セルをレンダリングする前に表示する行を把握するために、JTable のスクロール/ビューポート イベントをリッスンする方法はありますか? もしそうなら、カスタム TableModel をインターセプトして、一度に 1 ページずつプリフェッチさせたいと思います。

編集:明確にするために、ここでのポイントは、各行の内容を単独で取得するのではなく、表示されているテーブル行のグループの内容を 1 つのバッチで取得できるようにすることです。

4

2 に答える 2

3

http://www.javaworld.com/javaworld/javatips/jw-javatip137.htmlの記事をご覧ください。この記事には、データベースから行の「チャンク」を取得できるカスタム TableModel があります。

シナリオの別の解決策は、正確には探しているものではありませんが、プリフェッチではなく各行を遅延ロードすることです。方法については、自分の投稿を参照してください (「遅延読み込みを使用してデータベースにバインドされた JTable」を Google で検索してください)。テーブルモデルがキャッシュ/ロードされていない行を要求されると、列ごとに「wait..retrifying」文字列が返されるという考え方です (すべての列が文字列であると仮定します)。同時に、別のスレッドでタスクをスケジュールします (ExecutorService を使用)。次に、タスクはデータベースからデータを取得し、データモデルを更新します。私の投稿では、実際に Beans バインディングを使用したので、カスタム テーブルモデルの代わりにカスタム リストを使用しました。しかし、私はあなたがその考えを推測できると確信しています。

于 2010-01-14T11:26:15.690 に答える
2

実際、それはまさに JTable が許可するものです。getRowCount() メソッドがレコードの数を正確に反映している場合、セルが描画されると、表示されている部分のみがクエリされます。ビューポートでリッスンしてプリフェッチする方が速くなるとは思いません。

すべての getvalue リクエストを待つことができます。それらを記録し、「null」またはすでにキャッシュされた値を返します。次に、getvalue が呼び出されなかった後、たとえば 20 ミリ秒の間、記録されたすべてのセルに対して実際の要求を行います。モデルでrowUpdatedイベントを発生させて、JTableが再度再描画するようにします。

**[編集]** モデルでクエリされた最後のレコードのリストを維持できます。リストは、画面に表示される行数よりも長くする必要はありません。getValue() が数ミリ秒間クエリされなかった後、バックエンドに対してこの非同期一括リクエストを実行できます

ここでの唯一の問題は、ソート/フィルタリング アルゴリズムです。ビューポートにクエリを実行し、データをそれに依存させると、データとビューの間に 1 対 1 の関係が成立します。JTable 自体にないもの。しかし、それを回避する方法はないと思います。IDE デバッガーが Sun コードを掘り下げることができるようにします。次に、レンダリングの実装が再描画する行をどのように見つけるかを確認します。私は心から知りません。

于 2009-09-15T07:16:11.960 に答える