Java Swing JTable 表格【7:监听表格数据变化】

监听表格数据变化

终于进入到JTable的重头戏了,监听在任何Java项目中都是非常重要的,监听带来的一系列的操作也有时候非常复杂

在Excel表格中,当表格中的一个单元格的数据发生变化时,与之相关的数据也会同时发生变化,这就设计到表格监听器的知识。JTable的事件大致均针对表格内容的操作处理,包括字段内容改变、列数增加或减少、行数增加或减少、表格的结构改变等。这些事件称为TableModelEvent事件。要处理TableModelEvent事件必须实现TableModelListener,此接口定义了一个方法,即TableChanged();

接下来这个实例,主要用于创建一个表格,通过对这个表格中的某个单元格数据进行修改,使得与之相关的单元格数据反生变化。
例子如下:

    package com.acconsys.swing.chapter14;

    import java.awt.BorderLayout;

    /**
     * 展示如何处理TableModelEvent事件
     * 
     * @author Administrator
     * 
     */
    public class Test9 implements TableModelListener {

        JTable table = null;
        MyTable9 my = null;

        public Test9() {
            JFrame f = new JFrame();
            my = new MyTable9();
            my.addTableModelListener(this);
            table = new JTable(my);
            table.setPreferredScrollableViewportSize(new Dimension(550, 30));
            JScrollPane s = new JScrollPane(table);
            f.getContentPane().add(s, BorderLayout.CENTER);
            f.setTitle("表格事件处理");
            f.pack();
            f.setVisible(true);
            f.addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }

        @Override
        public void tableChanged(TableModelEvent e) {
            /**
             * 处理表格数据变化事件
             */
            // 获取所选数据的行数
            int row = e.getFirstRow();
            // 获得此行第二列的值
            int grade1 = ((Integer) my.getValueAt(row, 1)).intValue();
            // 获取此行第3列的值
            int grade2 = ((Integer) my.getValueAt(row, 2)).intValue();
            // 将两次获得的值进行叠加
            int total = grade1 + grade2;
            // 将变化的值赋给第4列
            my.mySetValueAt(new Integer(total), row, 3);
            // 系统重新绘制表格
            table.repaint();
        }

        public static void main(String[] args) {
            new Test9();
        }
    }

    class MyTable9 extends AbstractTableModel {

        // 使用AbstractTableModel来创建表格模型
        Object[][] p = {
                { "王鹏", new Integer(91), new Integer(1949), new Integer(1910) },
                { "朱学莲", new Integer(82), new Integer(1969), new Integer(1510) },
                { "梅婷", new Integer(47), new Integer(1957), new Integer(1040) },
                { "赵龙", new Integer(61), new Integer(1957), new Integer(1180) },
                { "李兵", new Integer(90), new Integer(1987), new Integer(1770) }, };
        String[] n = { "姓名", "工号", "出生年月", "薪水" };

        @Override
        public int getRowCount() {
            return p.length;
        }

        @Override
        public int getColumnCount() {
            return n.length;
        }

        @Override
        public Object getValueAt(int row, int col) {
            return p[row][col];
        }

        @Override
        public String getColumnName(int col) {
            return n[col];
        }

        @Override
        public Class<?> getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }

        @Override
        public boolean isCellEditable(int rowIndex, int columnIndex) {
            // 判断单元格是否可以编辑
            return true;
        }

        @Override
        public void setValueAt(Object value, int row, int col) {
            p[row][col] = value;
            fireTableCellUpdated(row, col);
        }

        public void mySetValueAt(Object value, int row, int col) {
            p[row][col] = value;
        }

    }

运行结果及操作说明

运行结果及操作说明

刚开始的时候工号+出生年月!=薪水
当在工号或出生年月修改值,按Enter后,工号+出生年月=薪水。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱的叹息

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值