如何设置JTable单元格在点击离开时仅保留最后输入的字符?
解决JTable编辑后只保留最后一个字符的问题
你的代码存在两个核心问题:
- 获取的是旧值:直接调用
getValueAt时,编辑器还未将用户输入的新内容提交到TableModel,拿到的是编辑前的旧单元格内容。 - 视图未更新:即使手动调用
setValueAt,编辑器的默认提交逻辑可能覆盖你的设置,且未触发视图刷新。
解决方案:通过自定义TableCellEditor处理编辑逻辑
正确的做法是在单元格编辑器的编辑停止方法中,直接获取用户输入的最新内容,处理后再提交到模型,确保视图同步更新。修改后的代码如下:
private JTable makeTable() { String data[][] = { {"Move Down", "hello"} }; String[] headers = { "Action", "Button" }; DefaultTableModel model = new DefaultTableModel(data, headers); JTable table = new JTable(model) { @Override public boolean isCellEditable(int row, int column) { return column == 1; } @Override public TableCellEditor getCellEditor(int row, int column) { // 仅为第二列配置自定义编辑器 if (column == 1) { return new DefaultCellEditor(new JTextField()) { @Override public boolean stopCellEditing() { // 获取编辑框中的最新输入内容 JTextField editorInput = (JTextField) getComponent(); String inputText = editorInput.getText(); // 处理文本:空文本直接保留,非空则取最后一个字符 String finalText = inputText.isEmpty() ? "" : inputText.substring(inputText.length() - 1); // 将处理后的值设置回编辑器,确保提交到模型的是正确内容 editorInput.setText(finalText); // 调用父类方法完成编辑提交 boolean submitSuccess = super.stopCellEditing(); // 触发表格视图更新,确保单元格显示最新值 fireTableCellUpdated(row, column); return submitSuccess; } }; } return super.getCellEditor(row, column); } }; return table; }
代码说明
- 自定义编辑器:重写
getCellEditor方法,为需要编辑的第二列提供自定义的DefaultCellEditor。 - 获取最新输入:通过
getComponent()拿到编辑用的JTextField,直接读取用户输入的最新文本。 - 文本处理:加入空文本判断,避免空字符串截取时报错;非空文本仅保留最后一个字符。
- 提交与更新:将处理后的值设置回编辑器,调用父类方法完成模型提交,最后触发表格视图更新,确保单元格显示修改后的值。
内容的提问来源于stack exchange,提问作者jwm197
相关产品推荐
相关产品推荐

