如何在按下回车键时获取JTable修改的单元格值?过滤数据时无法取值
解决JTable过滤后无法获取修改单元格值的问题
我一眼就看出问题所在了——当你给JTable加了过滤功能(比如用TableRowSorter)之后,TableModelEvent里拿到的行号是过滤后视图层的行号,但你直接用tableEmployeFiltrer.getValueAt()去取的时候,这个方法默认用的也是视图行号,可过滤后的视图行和原始TableModel的行号已经不对应了,自然拿不到正确的值。
给你调整一下代码,核心是把视图行号转换成原始模型的行号:
tableEmployeFiltrer.getModel().addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent evt) { // 把视图行号转换成原始TableModel的行号 int modelRow = tableEmployeFiltrer.convertRowIndexToModel(evt.getFirstRow()); // 从原始模型获取数据,而不是视图 String numDossier = tableEmployeFiltrer.getModel().getValueAt(modelRow, 0).toString(); // 同样用模型行号获取修改后的列值 float delai = Float.valueOf(tableEmployeFiltrer.getModel().getValueAt(modelRow, evt.getColumn()).toString()); mapRecuperer.put(numDossier, delai); JOptionPane.showMessageDialog(null, tableEmployeFiltrer.getModel().getValueAt(modelRow, evt.getColumn())); } });
关键说明:
convertRowIndexToModel():这个方法是JTable专门用来解决视图和模型行号不匹配的工具,不管有没有过滤,它都能把当前看到的行号转换成原始数据模型里对应的行号。- 尽量直接从
TableModel获取数据,而不是通过JTable的getValueAt(),因为JTable的方法依赖视图层状态,过滤后容易出现错位。
另外,建议加个空值判断,避免用户输入非数字内容导致Float.valueOf()抛出异常:
Object value = tableEmployeFiltrer.getModel().getValueAt(modelRow, evt.getColumn()); if (value != null && !value.toString().isEmpty()) { float delai = Float.parseFloat(value.toString()); mapRecuperer.put(numDossier, delai); }
内容的提问来源于stack exchange,提问作者abouyahia abdelilah
相关产品推荐
相关产品推荐

