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

