You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SWT Table多列排序异常及升降序实现方法咨询

修复SWT Table多列排序异常并实现升降序功能

我来帮你搞定这个SWT Table排序的问题,你的代码里有两个核心问题导致只有前两列生效,而且没有升降序切换功能,咱们一步步修复:

问题分析

  1. 列索引硬编码错误:你的代码里int index = column == tblclmnName ? 0 : 1; 只给tblclmnName分配了索引0,其他所有列都默认用索引1,所以点击第三到第六列时,实际都是按第二列排序,这就是为什么只有前两列看起来生效。
  2. 缺少升降序切换逻辑:当前代码每次点击列都只会执行升序排序,没有记录和切换排序方向的逻辑。

修复后的完整代码

下面是修复后的代码,我优化了排序逻辑,同时解决了上述两个问题:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:35:31