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

JTable内嵌JSpinner手动键盘输入时无法获取最后一位输入数字的问题

问题根因

你遇到的取值缺失问题是keyPressed事件的触发时机导致的:当keyPressed事件被触发时,你刚按下的字符还没有被写入到JSpinner内部的JTextField文本缓冲区中,此时调用commitEdit()方法拿到的永远是本次按键之前的旧值,所以会缺失最后一位输入。而回车键触发的actionPerformed事件是在文本更新完成后才执行,因此可以拿到完整值。

修复方案

直接将你代码中KeyAdapter的keyPressed方法替换为keyReleased方法即可,keyReleased会在按键抬起、字符已经写入输入框后触发,此时调用commitEdit()就能拿到包含本次输入的完整值。

关键修改代码片段

// 仅需把原来的keyPressed方法名改为keyReleased即可
((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().addKeyListener(new KeyAdapter() {    
    public void keyReleased(KeyEvent e) 
    {
        char tecla=e.getKeyChar();
        if(tecla>='0' && tecla<='9')
        {
            try {
                editor.commitEdit();
                spinner.commitEdit();
            } catch (ParseException ex) {
                Logger.getLogger(SpinnerEditor.class.getName()).log(Level.SEVERE, null, ex);
            }
            if(tabla.getSelectedRow()>=0)
            {
                String precio = tabla.getValueAt(tabla.getSelectedRow(),2).toString();
                int Iunidades = Integer.parseInt(spinner.getValue().toString());
                double Dprecio=Double.parseDouble(precio);
                double Total=Iunidades*Dprecio;
                modelo.setValueAt(String.valueOf(Iunidades),tabla.getSelectedRow(), 7);
                modelo.setValueAt(String.valueOf(Total),tabla.getSelectedRow(), 9);
                System.out.println(spinner.getValue().toString());
            }
        }
    }
});

额外优化建议

你当前isCellEditable方法中存在逻辑隐患:当通过按键触发单元格进入编辑状态时,你直接调用textField.setText(String.valueOf(ke.getKeyChar()))会覆盖原有值,如果你需要保留原有值、仅把新输入的字符追加到原有内容前/后,可以把这段逻辑删掉,改为在触发编辑后自动选中原有文本,输入新内容时直接覆盖选中的旧值,或者将光标移动到对应位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:15:03