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

Java中带筛选搜索的JTable选中单元格时JTextField值显示异常问题

问题解决:JTable筛选后选中单元格值显示错误

问题根源

当用TableRowSorter做筛选时,JTable的视图行号(getSelectedRow()返回的)和底层TableModel的模型行号已经不一一对应。你直接拿视图行号去模型里取值,自然会拿到错误的数据。

解决方法

必须把JTable返回的视图行号转换成模型行号,再用转换后的行号去模型中获取数据,用JTable自带的convertRowIndexToModel(int viewRow)方法就能完成转换。

修改取值代码

把原来的取值代码改成这样:

DefaultTableModel tblModel = (DefaultTableModel)table1.getModel();
// 将视图行号转换为模型行号
int modelRow = table1.convertRowIndexToModel(table1.getSelectedRow());

String tblsport = tblModel.getValueAt(modelRow, 1).toString(); 
String tblname = tblModel.getValueAt(modelRow, 2).toString(); 
String tblmeal = tblModel.getValueAt(modelRow, 3).toString(); 
name.setText(tblname);
sport.setText(tblsport);
meal.setText(tblmeal); 

优化筛选代码(可选但推荐)

每次调用filter方法都新建TableRowSorter属于没必要的重复操作,复用已有的排序器能提升性能:

// 在类中声明成员变量存储排序器
private TableRowSorter<DefaultTableModel> rowSorter;

// 在窗体初始化或构造方法里初始化一次排序器
public void initTable() {
    DefaultTableModel tblModel = (DefaultTableModel)table1.getModel();
    rowSorter = new TableRowSorter<>(tblModel);
    table1.setRowSorter(rowSorter);
}

// 修改后的filter方法
public void filter(String name){
    if(rowSorter != null){
        rowSorter.setRowFilter(RowFilter.regexFilter(name));
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 07:12:40