JTable中getCellEditorValue触发时机异常,需修改为编辑完成后调用
解决JTable中
getCellEditorValue过早触发的问题 看起来你遇到的核心问题是:原本应该在编辑完成后才执行的数据库更新操作,现在只要点击JTable的行就会触发——这是因为你把数据库更新逻辑放在了getCellEditorValue里,但这个方法的调用时机并不完全由"编辑完成"决定,JTable内部可能在编辑过程中多次调用它来获取临时值。
问题根源
getCellEditorValue的设计职责只是返回当前编辑器的内容,它可能在编辑启动、预览值等场景下被JTable内部调用,并不是专门用来处理编辑完成后的业务逻辑的。真正代表"编辑确认完成"的回调是CellEditorListener的editingStopped方法。
解决方案:分离职责+正确监听编辑完成事件
我们需要把数据库更新逻辑从getCellEditorValue移到编辑完成的回调中,同时确保JTable的编辑触发模式符合预期。
1. 重构TableCellEditor,专注于值的获取
首先调整自定义编辑器,让它只负责管理输入组件和返回编辑值:
public class CustomTextFieldEditor extends AbstractCellEditor implements TableCellEditor { private JTextField textField; private int currentEditRow; public CustomTextFieldEditor() { textField = new JTextField(); } @Override public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { currentEditRow = row; textField.setText(value != null ? value.toString() : ""); return textField; } @Override public Object getCellEditorValue() { // 这里只做一件事:返回编辑后的文本 return textField.getText(); } // 暴露当前编辑的行,供后续回调使用 public int getCurrentEditRow() { return currentEditRow; } }
2. 监听编辑完成事件,执行数据库更新
给编辑器添加CellEditorListener,在editingStopped方法里处理数据库更新——这个方法才是编辑真正完成的信号(比如切换到其他单元格、按下回车确认):
// 初始化JTable和编辑器 JTable yourTable = new JTable(); CustomTextFieldEditor editor = new CustomTextFieldEditor(); yourTable.setDefaultEditor(String.class, editor); // 添加编辑完成监听 editor.addCellEditorListener(new CellEditorListener() { @Override public void editingStopped(ChangeEvent e) { // 编辑完成时,获取最终值和编辑的行 String editedValue = (String) editor.getCellEditorValue(); int editRow = editor.getCurrentEditRow(); // 执行数据库更新操作 panelsign.updateAllergicReactions(editedValue, editRow); // 通知JTable更新单元格显示(如果需要) yourTable.setValueAt(editedValue, editRow, yourTable.getEditingColumn()); } @Override public void editingCanceled(ChangeEvent e) { // 编辑被取消时的处理(比如不执行数据库更新) } });
3. 配置JTable的编辑触发模式(可选)
如果你的JTable现在点击行就自动进入编辑状态,可以通过以下配置调整,让编辑只在双击、按F2或输入时触发:
// 关闭自动启动编辑的特性 yourTable.putClientProperty("JTable.autoStartsEdit", Boolean.FALSE); // 设置选择模式为单元格选择(可选,避免整行选择触发编辑) yourTable.setCellSelectionEnabled(true);
关键总结
- 不要在
getCellEditorValue中处理业务逻辑,它只是一个值获取器 - 依赖
editingStopped回调来确认编辑完成,这里才是执行数据库更新等操作的正确时机 - 通过配置JTable的编辑触发模式,可以避免意外触发编辑流程
内容的提问来源于stack exchange,提问作者Dman Cannon
相关产品推荐
相关产品推荐

