2012-04-26 65 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; 
    } 
}