2

SwingXプロジェクトJXTableから大量のデータを表示しています。データをロードした後、テーブルを呼び出しますが、200 百の列と 30,000 のレコードがある場合、5 秒以上かかる場合があります。これは、UI が 5 秒間ロックされていることを意味するスイング スレッドから呼び出しています。バックグラウンド スレッドを呼び出してみましたが、疑ったとおり、これを行うと奇妙な副作用が生じます。を呼び出した後、マウスをテーブルの上に置くと、テーブル内のすべての数値が常に異なる数値に更新されているように見えます。このような大きなテーブルの列をパックするときに、JXTable で適切なユーザー エクスペリエンスを得る方法はありますか。packAll()packAllpackAll()

4

4 に答える 4

4

このループインColumnFactoryはあなたを殺しています:

for (int r = 0; r < getRowCount(table); r++) {
        Component comp = renderer.getTableCellRendererComponent(table, table
                .getValueAt(r, column), false, false, r, column);
        width = Math.max(width, comp.getPreferredSize().width);
}

おそらく、列幅を自分で設定するか、1つの行をロードし、テーブルをパックしてから、残りのデータをロードする必要があります。

于 2011-03-17T19:11:37.863 に答える
2

ジェイ、あなたが正しいとマークした回答のどの部分が「優れたアイデア」を意味するのかわかりません-少なくとも少し不明確です. 2つの提案は次のとおりです。

a) 自分でやる: いつ、どこで、どのように正確に行うかについては未解決のままです。これは ColumnFactory で既に提供されています。getRowCount(JXTable) の API ドキュメントをお読みください。

コンテキストが getRowCount() の単純なオーバーライドで解決できるほど均一ではない場合でも、カスタム ColumnFactory を使用する方法があります。選択した測定戦略を実装できます :-)

@z7sg:何も「殺す」ものはありません-APIドキュメントを読んだことがあればお気づきかもしれません;-)セルの測定は完全に簡単ではありません。デフォルトの実装はすべてに適合しません。そのため、ColumnFactoryは拡張用に設計されています:サブクラスとニーズに合わせて調整します。

乾杯ジャネット

于 2011-03-23T11:19:34.663 に答える
1

200列あると言いますか?一度に 200 個すべてが表示されるとは思えません。では、最初の 10-20 列だけをパックするとどうなるでしょうか? これにより、時間遅延が 1/10 または 1/20 短縮されます。

JXTable で個々の列をパックできない場合は、通常の JTable で同じ機能を提供すると思われるTable Column Adjuster を使用してみてください。個々の列をパックできます。

于 2011-03-17T20:20:58.477 に答える
1

200 列と 30,000 行は、レンダリングに少し時間がかかります。抜本的なことをしない限り、待ち時間をなくすことはできないと思います。データが読み込まれるまでテーブルを表示しないことをお勧めします。

于 2011-03-17T18:20:02.687 に答える