2012-04-26 110 views
1

我有一個客戶端/服務器應用程序和我的JTables分頁,它只顯示一個範圍的數據。現在我想處理排序,但服務器端。我如何自定義默認排序實現?JTable服務器端排序

+0

*「現在我想處理排序,但服務器端」*爲什麼?這似乎是網絡和服務器上不必要的負擔。順便說一句 - 你試圖在這裏實現什麼功能,你可以向最終用戶解釋它?我懷疑,無論那個特徵是什麼,你都會以錯誤的方式去做。 – 2012-04-26 10:11:15

+0

例如。在db中,我有1.000.000條記錄,我無法在客戶端應用程序的jtable中顯示所有這些記錄,但我只會顯示前100個記錄。如果用戶單擊一個列標題來排序記錄,客戶端應用程序需要按新的排序標準獲取其他100條記錄。 – devmao 2012-04-26 11:02:36

+0

爲什麼不在查詢中添加一個ORDER BY'子句? – trashgod 2012-04-26 11:41:11

回答

1

我發現了一個可行的解決方案,但我相信它不是最好的! :)

... 
final MyTableModel myModel = new MyTableModel(); 
final MySorter mySorter = new MySorter(myModel); 
mySorter.addRowSorterListener(new RowSorterListener() { 

    @Override 
    public void sorterChanged(RowSorterEvent e) { 
    // server side sorting 
    sortDataByColumn(mySorter.getColumnToSort()); 
    } 
}); 

JTable table = new JTable(); 
table.setModel(myModel); 
table.setRowSorter(mySorter); 
... 

class MySorter extends TableRowSorter<TableModel> {  

    private String columnToSort; 

    public MySorter(AbstractTableModel model) { 
    super(model); 
    } 

    @Override 
    public void sort() { 
    // do nothing! because server side sorting 
    } 

    @Override 
    protected void fireSortOrderChanged() { 
    // build a string like [+-]column_identifier. 
    // where + is for ASC and - for DESC ordering 
    final SortKey k = getSortKeys().get(0); 
    final String colName = getModel().getTableColumnModel() 
     .getColumn(k.getColumn()).getIdentifier().toString(); 

    if (colName != null && !colName.isEmpty()) { 
     columnToSort = (k.getSortOrder() == SortOrder.ASCENDING ? '+' : '-') + colName; 
    } else { 
     columnToSort = null; 
    } 
    super.fireSortOrderChanged(); 
    } 

    public String getColumnToSort() { 
    return columnToSort; 
    } 
}