2014-07-01 65 views
0

在eclipse RCP應用程序中,我有一個VIRTUAL樣式的tableviewer用於消除大量數據。JFace表格查看器排序後的選擇問題

我使用的是自定義的內容提供商實現IStructuredContentProvider &自定義表查看執行ITableLabelProvider作爲表查看器的一部分。這

我有一個要求,通過所有列在表中的數據進行排序。

對於所有列,排序工作得很好。不過,我在桌上有一個選擇事件,並且有一些基於表選擇的操作。

讓我們下面要說的項目將顯示在視圖中的順序

  • 一個
  • Ç
  • d
  • Ë

點擊後一個特定的列,視圖按照下面提到的順序排列

  • Ë
  • d
  • Ç

但是,關於選擇E(表中的第一項),的項目A的細節是加載而不是項目E的細節。

它看起來像t他的模型沒有更新排序後的數據,因此不匹配。看起來排序只在UI上完成,並且模型沒有相應更新。

你能幫我解決嗎?

我不希望寫一個自定義的比較和寫入寫成的標籤提供給各個列進行排序,並使用比較排序模型的getColumnText部分相同的邏輯。

注意:如果我拿出虛擬樣式並檢查選定的項目,它工作得很好。所選項目的詳細信息按預期加載。

PFB,用於我的應用程序排序的代碼塊。

TableColumnSorter cSorter = new TableColumnSorter(tabViewer, column.getColumn()) { 
     protected int doCompare(Viewer v, Object e1, Object e2) { 
       ITableLabelProvider lp = ((ITableLabelProvider) tabViewer 
       .getLabelProvider()); 
       String t1 = lp.getColumnText(e1, colIdx); 
       String t2 = lp.getColumnText(e2, colIdx); 

       return t1.compareTo(t2); 
     } 
}; 

cSorter.setSorter(cSorter, TableColumnSorter.ASC); 

自定義TableColumnSorter類是如下

abstract class TableColumnSorter extends ViewerComparator { 

    public static final int ASC = 1; 

    public static final int NONE = 0; 

    public static final int DESC = -1; 

    private int direction = 0; 

    private TableColumn column; 

    private TableViewer viewer; 

    public TableColumnSorter(TableViewer viewer, TableColumn column) { 
      this.column = column; 
      this.viewer = viewer; 
      this.column.addSelectionListener(new SelectionAdapter() { 

        public void widgetSelected(SelectionEvent e) { 
          if (TableColumnSorter.this.viewer.getComparator() != null) { 
            if (TableColumnSorter.this.viewer.getComparator() == TableColumnSorter.this) { 
              int tdirection = TableColumnSorter.this.direction; 

              if (tdirection == ASC) { 
                setSorter(TableColumnSorter.this, DESC); 
              } else if (tdirection == DESC) { 
                setSorter(TableColumnSorter.this, ASC); 
              } 
            } else { 
              setSorter(TableColumnSorter.this, ASC); 
            } 
          } else { 
            setSorter(TableColumnSorter.this, ASC); 
          } 
        } 
      }); 
    } 

    public void setSorter(TableColumnSorter sorter, int direction) { 
      if (direction == NONE) { 
        column.getParent().setSortColumn(null); 
        column.getParent().setSortDirection(SWT.NONE); 
        viewer.setComparator(null); 
      } else { 
        column.getParent().setSortColumn(column); 
        sorter.direction = direction; 

        if (direction == ASC) { 
          column.getParent().setSortDirection(SWT.DOWN); 
        } else { 
          column.getParent().setSortDirection(SWT.UP); 
        } 

        if (viewer.getComparator() == sorter) { 
          viewer.refresh(); 
        } else { 
          viewer.setComparator(sorter); 
        } 

      } 
    } 

    public int compare(Viewer viewer, Object e1, Object e2) { 
      return direction * doCompare(viewer, e1, e2); 
    } 

    protected abstract int doCompare(Viewer TableViewer, Object e1, Object e2); 
} 

回答

3

從JavaDoc中TableViewer

的TableViewer現在支持SWT.VIRTUAL標誌。如果底層表 是SWT。VIRTUAL,內容提供者可以實現 ILazyContentProvider而不是IStructuredContentProvider。 請注意,在這種情況下 ,查看器不支持排序或篩選。

+0

感謝您的回覆。但問題不在於排序。排序工作完美。這是排序後選擇表格的問題。正如問題中提到的,項目選擇給出了不同的模型對象而不是選定的模型對象。對於設置了虛擬標誌的表格,可以排序嗎? – user1166031