1

一般的な範囲に基づいて、さまざまなクラスのデータの一般的なフィルターを実装しようとしています。最初の反復では、これは列の名前と列内のデータのクラスがわかっている JTable 用です。この場合、フィルター ビューは次のようになります。

ColumnTitle コンボボックス: コンボボックスである/そうではない: =、>、<、テキストボックスの最小値、テキストボックスの最大値の間

テーブルの列は、XML ビルダーで指定された String、double、int などである場合があり、他の列に基づいてフィルター処理するこれらの行が複数ある場合があります。[明らかに、これらの多くは世界に存在します。]

Range基本的に次のようなクラスを使用して、これを RowFilters に結び付けたいと思います。

public class Range<T extends Comparable<? super T>> {

T low;
T high;

public Range(T aLow, T aHigh) {
    low = aLow;
    high = aHigh;
}

public boolean includes(T value) {
    boolean result = true;
    if ((getLow() != null) && (getLow().compareTo(value) > 0)) {
         return false;
    }

    if ((getHigh() != null) && (getHigh().compareTo(value) < 0)) {
         return false;
    }

    return true;
}

public T getLow() {
    return low;
}

public void setLow(T low) {
    this.low = low;
}

public T getHigh() {
    return high;
}

public void setHigh(T high) {
    this.high = high;
}

@Override
public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("Range = ").append(low).append(" to ").append(high);
    return sb.toString();
}
}

私の考えは、本質的に(以下の実際のコードではなく)次のリストを作成することです。

class Filter { 
    Range<?> range;
    String name;
    Class<?> filterClass;
}

RowFilter個々のフィルター ビュー (またはコントローラー) でクラス比較を行い、適用する必要があるときにこれらを変換します。

私が取り組んでいるコード ベースには、何百ものステートメントがあり、次のように単純に嫌いです if (bob instanceof Person)

それを回避しようとして、ジェネリックとクラスのキャストで問題が発生しています。

これはジェネリック型の消去で避けられない問題ですか? もしそうなら、どこにでも散らばっているクラステストを回避する適切な回避策はありますか?

残念ながら私はできません: - Guava または Java 以外のものを使用します (6 でも)。- XML ベースのテーブル ビルダー全体をやり直します。- データベースを使用する

テーブルやデータベースを持っていて、コードのコンパイル時にデータの説明がわからないアプリケーションはたくさんあるはずです。

4

1 に答える 1

2

一連のフィルター コードを記述する代わりに、TableModel以下を使用してレベルで物事をフィルター処理できます。TableRowSorter

TableModel を使用して並べ替えとフィルター処理を行う RowSorter の実装。

あなたが説明したようにジェネリックRowFilterを実装するだけです。

ただし、エンドユーザーの並べ替えに適した方法で実装することを要求する代わりにComparable(ロケールに依存する必要がある場合があります)、Comparator<? super T>代わりに を使用して値を並べ替えます。そうすれば、null一貫して s を処理することもできます。

于 2012-10-26T21:36:49.090 に答える