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

如何在按下回车键时获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:41:30