2

JXTableSwingXプロジェクトのfromには、RowFilterに直接設定するメソッドがありJXTableます(を参照JXTable#setRowFilter)。

フィルタの実装が動的である場合に何をする必要があるかは私にはわかりません。

比較すると、JDKRowSorterではJDK1.6にインターフェースが導入されており、このインターフェースでは。をアタッチできますRowSorterListener。ダイナミックRowSorter(フィルタリングにも使用可能)がある場合は、フィルターが変更されたときにそれらのリスナーにイベントを発生させることができます(ただし、JDKにはまたRowSorterはなどがないため、フィルターがにアクセスできる必要があります) )。DynamicRowFilterRowFilterEvent

私が期待するのは、に「監視可能」を設定でき、RowFilterJXTableもする必要がないということです。しかし、それは現在のAPIでは不可能であるように思われるので、次善の策は何ですか?

  • フィルタが変更されるたびに、フィルタを再設定します。以前に設定されたものとまったく同じインスタンスであるため、これも効果がありJXTableますか?
  • テーブルイベントを悪用し、テーブルモデルが変更されたというイベントを発生させるだけで、並べ替え/フィルタリングが再トリガーされます
  • メソッドを使用せずsetRowFilter、独自のメソッドを作成TableRowSorterして、JDKAPIにフォールバックします。
4

1 に答える 1

3

ユースケースは、モデルの要素をフィルターで除外するように変更できるフィルター(rowfilterではない)であり、それらの要素をフィルターで除外する動的フィルターに基づくRowFilterがあります。

私のコメントを繰り返します:RowFilterは不変でなければなりません。ソート/フィルタリングがコアに導入されたとき、それは意識的な設計上の決定でした。したがって、「動的」フィルタリングを実装するためのアプローチは、

  • カスタムフィルター(rowFilterではない)を監視可能にする
  • そのフィルターのリスナーを実装して、変更時に新しいRowFilterを作成します
  • rowFilterをxtable(SwingXの場合)またはDefaultRowSorter(コアの場合)に設定します

編集

私はそのデザインに同意しませんが、彼を揺さぶることはできませんでした

あるべきです:私は同意しませんでした-その間、私は以前ほど確信が持てません;-)

このアプローチの利点は、RowFilterが実装するのに非常に小さなコインであり、非常に再利用可能であるということです。単純な述語であり、他には何もありません。これにより、フィルターの単純な論理合成(および/または)が可能になります。フィルターの一部に通知する負担はなく、ソーター(または複合フィルター)の一部にリッスンして更新する負担もありません。次に、フィルター変更の「ダイナミクス」はユーザーの操作に起因することが多く、いずれにせよ何かがそれらのユーザートリガーをリッスンする必要があることを考慮すると、新しいrowFilterを作成することと、既存のrowFilterを更新することは大したことではありません。

于 2012-11-22T11:56:41.133 に答える