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
相关产品推荐
相关产品推荐

