SWT Table多列排序异常及升降序实现方法咨询
修复SWT Table多列排序异常并实现升降序功能
我来帮你搞定这个SWT Table排序的问题,你的代码里有两个核心问题导致只有前两列生效,而且没有升降序切换功能,咱们一步步修复:
问题分析
- 列索引硬编码错误:你的代码里
int index = column == tblclmnName ? 0 : 1;只给tblclmnName分配了索引0,其他所有列都默认用索引1,所以点击第三到第六列时,实际都是按第二列排序,这就是为什么只有前两列看起来生效。 - 缺少升降序切换逻辑:当前代码每次点击列都只会执行升序排序,没有记录和切换排序方向的逻辑。
修复后的完整代码
下面是修复后的代码,我优化了排序逻辑,同时解决了上述两个问题:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collator; import java.util.List; import java.util.Locale; import org.eclipse.swt.SWT; import org.eclipse.swt.events.Listener; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; // 你的排序监听器修复版 Listener sortListener = new Listener() { public void handleEvent(Event e) { TableColumn clickedColumn = (TableColumn) e.widget; Table table = clickedColumn.getParent(); // 1. 正确获取当前点击列的索引(适配任意列数) int columnIndex = Arrays.asList(table.getColumns()).indexOf(clickedColumn); // 2. 切换升降序:点击同一列反转方向,新列默认升序 int sortDirection = table.getSortColumn() == clickedColumn ? (table.getSortDirection() == SWT.UP ? SWT.DOWN : SWT.UP) : SWT.UP; // 3. 提取所有表格行的数据到List,方便排序 List<String[]> rowData = new ArrayList<>(); for (TableItem item : table.getItems()) { String[] row = new String[table.getColumnCount()]; for (int i = 0; i < row.length; i++) { row[i] = item.getText(i); } rowData.add(row); } // 4. 根据列索引和排序方向执行排序 Collator collator = Collator.getInstance(Locale.getDefault()); rowData.sort((row1, row2) -> { int compareResult = collator.compare(row1[columnIndex], row2[columnIndex]); // 降序时反转比较结果 return sortDirection == SWT.DOWN ? -compareResult : compareResult; }); // 5. 清空表格并重新添加排序后的行 table.removeAll(); for (String[] row : rowData) { TableItem item = new TableItem(table, SWT.NONE); item.setText(row); } // 6. 更新表格的排序状态(列和方向) table.setSortColumn(clickedColumn); table.setSortDirection(sortDirection); } }; // 给所有列绑定排序监听器 tblclmnName.addListener(SWT.Selection, sortListener); tblclmnLevel.addListener(SWT.Selection, sortListener); tblclmnApplication.addListener(SWT.Selection, sortListener); tblclmnDate.addListener(SWT.Selection, sortListener); tblclmnTime.addListener(SWT.Selection, sortListener); tblclmnAssignment.addListener(SWT.Selection, sortListener); // 初始化默认排序状态 table.setSortColumn(tblclmnName); table.setSortDirection(SWT.UP);
关键修改说明
- 动态获取列索引:用
Arrays.asList(table.getColumns()).indexOf(clickedColumn)替代硬编码,不管你后续新增多少列,都能自动获取正确的索引。 - 升降序切换:通过判断当前点击的列是否为已排序列,自动切换
SWT.UP和SWT.DOWN方向,实现点击同一列切换排序顺序的效果。 - 排序逻辑优化:先把所有行数据提取到List中排序,再重新构建表格,比原代码的插入排序更简洁高效,也避免了直接操作
TableItem数组可能带来的异常。 - 适配多列:所有列共用同一个监听器,无需为每列单独写逻辑,扩展性更好。
内容的提问来源于stack exchange,提问作者jeremy
相关产品推荐
相关产品推荐

