java-swing-JTable自动计算,自动更改Jtable的列值

在swing的jtable中,怎么实现自动计算呢,就是类似于execl表格中,输入某个计算公式后,改变对应的值,会自动更新结果值。

其实对于jtable来说不难,直接用TableModelListener监听器就行了,代码如下:

import java.awt.*;
import javax.swing.*;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;

public class Test {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setBounds(100, 100, 800, 400);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.setBounds(0, 0, 600, 361);


        String[][] str = {{"小贾", "60", "70", "50", ""}, {"阿P", "80", "90", "60", ""}, {"小李", "70", "70", "70", ""}};
        String[] title = {"姓名", "语文分数", "数学分数", "英语分数", "总分数"};
        JTable table = new JTable();//测试表格
        table.putClientProperty("terminateEditOnFocusLost", true);
        DefaultTableModel dtm = new DefaultTableModel(str, title);
        table.setModel(dtm);
        table.setFont(new Font("微软雅黑", Font.PLAIN, 12));
        dtm.addTableModelListener(new TableModelListener() {

            public void tableChanged(TableModelEvent e) {

                int type = e.getType();// 获得事件的类型

                int row = e.getFirstRow();// 获得触发此次事件的表格行索引
                System.out.println("row:" + row);
                int column = e.getColumn();// 获得触发此次事件的表格列索引
                System.out.println("column:" + column);
                //总分数在第5列,当column = 4时,直接return
                if (column == 4) return; //这个判断必须加,哪一列需要自动修改,就在那一列return,不然会出现异常报错。

                if (type == TableModelEvent.UPDATE) {

                    TableModel model = (TableModel) e.getSource();//自动获取表格模型
                    //我这里是直接刷新全部的列的值,你们也可以根据需要刷新对应行的列值也行
                    int rows = table.getRowCount();
                    for (int i = 0; i < rows; i++) {
                        int yuwen = Integer.parseInt(table.getValueAt(i,1).toString());
                        int shuxue = Integer.parseInt(table.getValueAt(i,2).toString());
                        int yingyu = Integer.parseInt(table.getValueAt(i,3).toString());
                        table.setValueAt((yuwen+shuxue+yingyu),i,4);
                    }
                }
            }
        });

        JScrollPane scrollPane_1 = new JScrollPane(table);//滚动组件
        panel.add(scrollPane_1, BorderLayout.CENTER);
        frame.add(panel);
        frame.setVisible(true);
    }
}

其中,需要特别注意的就是在tableChanged(TableModelEvent e)函数中,一定要加入 if (column == 4) return;这一行,因为我的总分数在第五列,对应索引就是4,代码中也有特别说明。这个判断必须加,哪一列需要自动修改,就在那一列return,不然会出现异常报错

运行代码后效果如下图

修改每个分数值,对应的总分数都会变化。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值