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

如何设置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;
}

代码说明

  1. 自定义编辑器:重写getCellEditor方法,为需要编辑的第二列提供自定义的DefaultCellEditor。
  2. 获取最新输入:通过getComponent()拿到编辑用的JTextField,直接读取用户输入的最新文本。
  3. 文本处理:加入空文本判断,避免空字符串截取时报错;非空文本仅保留最后一个字符。
  4. 提交与更新:将处理后的值设置回编辑器,调用父类方法完成模型提交,最后触发表格视图更新,确保单元格显示修改后的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:24:18