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

如何让JTable单元格监听值变化并自动计算行总和?

问题

我有一个包含3列的JTable,列名分别为firstvalue、secvalue和total。该表格支持编辑,运行时firstvalue和secvalue列初始值为0.0。需求是用户在这两列的任意单元格输入数值后,同一行的total列自动显示两数之和,无需点击按钮。尝试使用TableCellListener但所有涉及该类的代码行均报错,以下是我的代码:

Action myaction = new AbstractAction()
{
    public void actionPerformed(ActionEvent e)
    {
        TablecellListener tblisten = (TableCellListener)e.getSource();
        int row = tblisten.getRow();
        int col = tblisten.getColumn();
        Integer secondcol = 1;
        Integer totalcol = 2;
        int sum;
        //get value
        Integer fval = (Integer)table.getModel().getValueAt(row, col);
        Integer sval = (Integer)table.getModel().getValueAt(row, scol);

        //find the sum

        //set value
        table.setvalueAt(sum,row,totalcol);
    }
}
解决方案

问题分析

  1. TableCellListener类未定义:该类并非Java Swing内置类,直接引用会导致编译报错,需自行实现或更换方案。
  2. 代码语法错误:存在未定义变量scol、方法名拼写错误setvalueAt(正确为setValueAt)。
  3. 类型不匹配:需求中初始值为浮点型0.0,但代码用Integer接收,会触发类型转换异常。
  4. 逻辑漏洞:未处理另一列可能为初始值的情况,计算逻辑不完整。

修正实现(自定义TableModel方案)

无需依赖第三方监听器,通过自定义TableModel是Swing官方推荐的规范实现方式:

import javax.swing.*;
import javax.swing.table.DefaultTableModel;

public class AutoSumTable extends JFrame {
    public AutoSumTable() {
        String[] columns = {"firstvalue", "secvalue", "total"};
        // 初始化数据,前两列默认0.0
        Object[][] data = {
                {0.0, 0.0, 0.0},
                {0.0, 0.0, 0.0}
        };

        DefaultTableModel model = new DefaultTableModel(data, columns) {
            @Override
            public void setValueAt(Object aValue, int row, int column) {
                // 仅处理前两列的编辑操作
                if (column == 0 || column == 1) {
                    // 更新当前单元格值
                    super.setValueAt(aValue, row, column);
                    // 获取当前行的两个浮点值
                    Double val1 = (Double) getValueAt(row, 0);
                    Double val2 = (Double) getValueAt(row, 1);
                    // 计算总和并设置到total列
                    super.setValueAt(val1 + val2, row, 2);
                }
            }

            // 设置total列不可编辑
            @Override
            public boolean isCellEditable(int row, int column) {
                return column != 2;
            }
        };

        JTable table = new JTable(model);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
        add(new JScrollPane(table));

        setTitle("自动求和表格");
        setSize(400, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(AutoSumTable::new);
    }
}

关键说明

  • 自动计算逻辑:重写setValueAt方法,在用户编辑前两列时自动触发总和计算并更新total列。
  • 类型安全:使用Double类型处理数值,匹配初始值为0.0的需求,避免类型转换错误。
  • 交互优化:设置total列不可编辑,防止用户手动修改计算结果。
  • 线程安全:通过SwingUtilities.invokeLater创建UI组件,符合Swing线程规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 18:21:22