我已經使用setAutoCreateRowSorter方法在JTable中啓用排序。鼠標點擊列標題將在升序和降序之間切換,但我想在升序,降序和原始(未排序)行順序之間切換。任何提示如何實現這一目標?如何使用JTable的行分揀機恢復原始行順序?
回答
在BasicTableHeaderUI中實現了鼠標單擊到更改排序狀態的映射,並且僅通過RowSorter的toggleSortOrder(columnIndex)實現。它的默認行爲是切換
UNSORTED - > ASCENDING - > DESCENDING - > ASCENDING -
就是沒辦法回UNSORTED。如果要求是簡單地擴大圓分成:
UNSORTED - > ASCENDING - > DESCENDING - UNSORTED - > ASCENDING -
要走的路是繼承TableRowSorter還並相應地覆蓋其toggleSortOrder
/**
* @inherited <p>
*/
@Override
public void toggleSortOrder(int column) {
List<? extends SortKey> sortKeys = getSortKeys();
if (sortKeys.size() > 0) {
if (sortKeys.get(0).getSortOrder() == SortOrder.DESCENDING) {
setSortKeys(null);
return;
}
}
super.toggleSortOrder(column);
}
注意:這有點簡化,因爲它沒有考慮n元排序的列,請參見完整版本的SwingX DefaultSortController。或者使用SwingX下手,其JXTable有API來配置排序週期就像
table.setSortOrderCycle(ASCENDING, DESCENDING, UNSORTED);
乾杯 珍
由於內置的排序機制只允許您升序或降序排列,因此如果您在JTable附近的某處提供了外部重新加載JButton,您可以返回到原始狀態,只需將相同的模型設置回當你在任何分類活動發生之前第一次顯示錶格。
如果您正在尋找使用它的UI方式 - 在列標題上按住shift鍵點擊即可。這是內置的JTable功能
如果您使用的是DefaultRowSorter
:「一個空的sortKeys
列表表明該視圖應[未]排序,與模型相同。」
RowSorter rs = table.getRowSorter();
rs.setSortKeys(null);
附錄:請注意,「null
是指定一個空列表的簡寫」中setSortKeys()
。
此代碼實現循環ASCENDING-> DESCENDING-> UNSORTED - > ...沒有覆蓋TableRowSorter還:
TableRowSorter sorter = new TableRowSorter(getModel());
setRowSorter(sorter);
// Remove default sort MouseListener
for (MouseListener mouseListener : getTableHeader().getMouseListeners()) {
if (mouseListener instanceof javax.swing.plaf.basic.BasicTableHeaderUI.MouseInputHandler) {
getTableHeader().removeMouseListener(mouseListener);
}
}
// Add MouseListener for onClick event
getTableHeader().addMouseListener(new MouseAdapter() {
private SortOrder currentOrder = SortOrder.UNSORTED;
@Override
public void mouseClicked(MouseEvent e) {
int column = getTableHeader().columnAtPoint(e.getPoint());
RowSorter sorter = getRowSorter();
List sortKeys = new ArrayList();
switch (currentOrder) {
case UNSORTED:
sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING));
break;
case ASCENDING:
sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING));
break;
case DESCENDING:
sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED));
break;
}
sorter.setSortKeys(sortKeys);
}
});
Kornell的答案是爲我工作的偉大(!感謝)
我做了這些改變可能使他人有所幫助:
- 將列從視圖轉換爲模型座標。這是原創中的一個錯誤。
- 忽略刪除其他鼠標偵聽器,因爲這樣做會禁用列拖動和調整大小。
- 篩選出除左鍵點擊以外的任何內容
只要列更改,重新初始化排序順序。用戶體驗以這種方式顯着更直觀,因爲您可以連續點擊不同的列並每次升序。
TableRowSorter sorter = new TableRowSorter(getModel()); setRowSorter(sorter); getTableHeader().addMouseListener(new MouseAdapter() { private SortOrder currentOrder = SortOrder.UNSORTED; private int lastCol = -1; @Override public void mouseClicked(MouseEvent e) { int column = getTableHeader().columnAtPoint(e.getPoint()); column = convertColumnIndexToModel(column); if (column != lastCol) { currentOrder = SortOrder.UNSORTED; lastCol = column; } RowSorter<?> sorter = getRowSorter(); List<SortKey> sortKeys = new ArrayList<SortKey>(); if (e.getButton() == MouseEvent.BUTTON1) { switch (currentOrder) { case UNSORTED: sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING)); break; case ASCENDING: sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING)); break; case DESCENDING: sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED)); break; } sorter.setSortKeys(sortKeys); } } });
- 1. 如何禁用jtable行分揀機
- 2. 如何在分揀機更改行順序後更新JTableModel?
- 3. 如何恢復NSMutableArray的原始排序順序?
- 4. 使用jQuery DataTable恢復原始排序順序
- 5. 當應用分揀機時刪除JTable行導致IndexOutOfBoundsException
- 6. 如何使用IEnumerable連接分揀機,每臺分揀機都遵守上一次生產的順序?
- 7. 行程分揀機API
- 8. 如何在Linux中保留原始順序來複制行?
- 9. 恢復原始後退按鈕行爲
- 10. 恢復原始值
- 11. Eclipse控制檯:恢復行順序
- 12. 如何在Java中的字符串中使用\ n後恢復爲原始行?
- 13. 當表分揀機使用
- 14. 原始數據幀行的順序是否與原始數據幀行相同?
- 15. Matlab分揀程序是否始終保留排序組中的原始排序?
- 16. 如何使用YUI3恢復元素的原始高度?
- 17. 如何將(不完整)選擇列表的順序恢復到其原始順序?
- 18. 如何恢復Coolbar樂隊的順序?
- 19. 修復jQuery表格分揀機標題行
- 20. 無法恢復從反編譯的簡單應用程序的原始行爲
- 21. 如何在Hive中按原始順序選擇行?
- 22. 恢復「原始」訂單
- 23. Nodejs:require.paths。恢復原始路徑
- 24. WordPress - 恢復原始WP_Query
- 25. 如何進行分揀工作?
- 26. 鏈接列表:如何在C中進行分揀機檢查?
- 27. JTable重複行
- 28. DataGrid在離開行時將值恢復爲原始值
- 29. 恢復使用原型
- 30. 如何使用原始數據順序(不按字母順序)生成箱圖?
請注意,自行設置行排序器意味着您不必再調用setAutoCreateRowSorter()。如果仍然調用它,它將覆蓋您添加的RowSorter。 – awmross 2015-07-18 09:18:42