2012-03-23 8 views
1

Eclipse RCPアプリケーションに仮想テーブルがあります。バックエンドへの呼び出しを行って、仮想テーブル内のデータを取得します。仮想テーブルとViewerComparatorのデフォルトソートの問題

単一の列の表に対してデフォルトのソートが必要です。 ViewerComparatorを使用してソート機能を実現します。私の問題は、私はテーブルが最初の時間のデータを読み込むときに、このソート機能を得ることができないということです。しかし、私が列をクリックすると、すべて正常に正常に動作します。

これは私がカスタムビューアの列

TableViewerColumn tvc = viewer.addColumn(100, SWT.LEFT, "Name"); 
    viewer.setColumnComparator(tvc, 
      new Comparator<Person>() { 
       @Override 
       public int compare(Person o1,Person o2) { 
        double firstValue = Double.parseDouble(o1 
          .getAge()); 
        double secondValue = Double.parseDouble(o2 
          .getAge()); 
        return firstValue > secondValue ? 1 : -1; 
       } 
      }); 

setColumnComparator方法

public void setColumnComparator(TableViewerColumn tvc, Comparator<T> cmp){ 
    final MyViewerComparator c = new MyViewerComparator(cmp); 
    final TableColumn tc = tvc.getColumn(); 

    setComparator(c); 
    getTable().setSortDirection(c.getDirection()); 
    getTable().setSortColumn(tc); 
    refresh(); 

    tc.addSelectionListener(new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
         <same code as above> 
     } 
    }); 

MyViewerComparator

class MyViewerComparator extends ViewerComparator{ 
    Comparator<T> cmp; 
    boolean desc = true; 
    MyViewerComparator(Comparator<T> cmp){ 
     this.cmp = cmp; 
    } 
    int getDirection(){ 
     return desc?SWT.UP:SWT.DOWN; 
    } 

    void flipDirection(){ 
     desc = !desc; 
    } 

    @Override 
    public int compare(Viewer viewer, Object e1, Object e2) { 

場合(E1 ==にコンパレータを設定する方法であり、 null || e2 == null){

  return 0; 
     } 
     int rc = cmp.compare((T)e1, (T)e2); 
     if(desc) 
      return -rc; 
     return rc; 
    } 
} 

テーブルは1回目のデータをロードするとき、オブジェクトの一つが

常にNULLある注意として、上記のコードで太字条件内部に入ります。この機能は、VIRTUAL TABLEではなくStandardテーブルを使用すると完全に正常に機能します。そのうまくいけば... ObservableListContentProvider

お知らせください

+0

誰かがこの問題を解決できるかどうか本当に感謝しますか?私はいつかこの問題に悩まされています。私は本当にこの問題を解決する必要があります。 – user1166031

+0

あなたはhttp://www.eclipse.org/forums/index.php/t/288720/を見ましたか? –

答えて

1

後半の答え:私が使用

のContentProviderがある..私たちは同様に遅延ロード機能を必要として標準テーブルを使用するように変更できるかどうかわかりませんまだ他人を助ける。 ObservableListContentProviderとSWT.VIRTUALをソートと組み合わせて使用​​した場合、まったく同じ問題が発生しました。

SWT.VIRTUALの元の目的は、内容の一部のみを表示するために内容のすべての要素を取得する必要がないということです。現在表示される必要がある要素を画面に返すだけでよいカスタムコンテンツプロバイダを実装する必要があります。テーブルに存在する要素の総数も伝えなければなりません。このようなユースケースでは、すべての要素が分かっているわけではないため、ViewerComparatorを使用してテーブルを通常の方法でソートすることはできません。しかし、SWT.VIRTUALは、多くの要素を持つ表をレンダリングするためのパフォーマンスの最適化としても使用できます。これは、観測できないArrayContentProviderでうまくいくようです。

しかし、ObservableListContentProviderを使用しているときは、あなたと同じ問題が発生しています。どういうわけか、それはスマートになり、実際に変更された要素だけを更新しようとします。実装の深いところでは、仮想テーブルで何かがうまくいかず、正確には何もわかりません。しかし、私は解決策があります:ObservableListContentProviderをまったく使用せず、単にテーブルビューアを更新してください。たとえば、平野ArrayContentProviderを使用すると、視聴者のIObservableList内容に以下のリスナーを追加します。

new IListChangeListener() { 
       @Override 
       public void handleListChange(ListChangeEvent event) { 
        viewer.refresh(); 
       } 
      }; 

私は実際にはまさにこれを行い自分の「SimpleObservableListContentProvider」を実装するだけでなく、inputChangedメソッドを実装することで、テーブルの入力を切り替えるの面倒を見ますこのリスナーを古い入力リストから削除し、新しいリスナーに追加します。

関連する問題