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

JTable过滤后鼠标点击事件返回旧值问题求助

问题根源

你遇到的问题核心是视图行索引和模型行索引不匹配:

  • table.getSelectedRow()返回的是过滤后表格(视图层)的行位置,不是底层TableModel的真实行索引
  • 过滤后视图的行顺序/数量和原始模型已经不同,直接用视图索引去模型取值,自然会拿到错误的原始数据
解决方案

把视图行索引转换成模型的真实索引,使用JTable.convertRowIndexToModel(int viewIndex)方法即可。

修正后的getClickedProject代码:

public String[] getClickedProject(JTable table) {
    String[] projectPathAndName = new String[2];
    int viewRowIndex = table.getSelectedRow();
    // 转换为模型层的真实行索引
    int modelRowIndex = table.convertRowIndexToModel(viewRowIndex);
    projectPathAndName[0] = table.getModel().getValueAt(modelRowIndex, 0).toString().trim();
    projectPathAndName[1] = table.getModel().getValueAt(modelRowIndex, 1).toString().trim();
    return projectPathAndName;
}
额外优化提示

你的filterTableByProject方法每次调用都会创建新的TableRowSorter,可以改为复用已有的排序器,避免重复创建对象:

public void filterTableByProject(JTable table, String projectName) {
    TableRowSorter<?> sorter = table.getRowSorter();
    if (sorter == null) {
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        sorter = new TableRowSorter<>(model);
        table.setRowSorter(sorter);
    }
    // 注意:regexFilter默认匹配所有列,若只想匹配特定列,可指定列索引,比如只匹配第1列:RowFilter.regexFilter(projectName, 1)
    sorter.setRowFilter(RowFilter.regexFilter(projectName));
}

内容的提问来源于stack exchange,提问作者Elia123456

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:35:40