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

