如何在表上的特定列发生更改

时间:2018-02-13 12:32:56

标签: java swing jtable

我创建了一个监听特定列的TableModelListener。具体而言,列 2,3,4,5 。这样当 2-5 中的任何列具有值或not null时,它会将值存储添加到BigDecimal值以获得总和。之后,我需要将第6列的值设置为列 2-5 的值的总和。所以我认为我可以简单地收集值然后如果它遇到列 6 ,它将设置总和。

这是代码。

@Override
    public void tableChanged(TableModelEvent e) {
        DefaultTableModel tableModel = (DefaultTableModel) e.getSource();
        if (tableModel.getRowCount() > 0) {
            for (int row = 0; row < tableModel.getRowCount(); row++) {
                BigDecimal sum = new BigDecimal(BigInteger.ZERO).setScale(2,RoundingMode.HALF_UP);
                for (int col = 0; col < tableModel.getColumnCount(); col++) {
                    if (col == 2 || col == 3 || col == 4 || col == 5) {
                        if (tableModel.getValueAt(row, col) != null) {
                            sum = sum.add(new BigDecimal(Double.parseDouble(tableModel.getValueAt(row, col).toString())));
                        }
                    } 
                }
                JOptionPane.showMessageDialog(null,"Sum: "+sum);
                tableModel.setValueAt(sum, row, 6);
            }
        }
    }

所以会发生什么,我得到一个带有sum值的无限JOptionPane Dialog。 我在网上研究并认为可能在编辑后我可以通过添加view.getMyJTable().putClientProperty("terminateEditOnFocusLost", true);

来终止监听器

没有帮助。我基本上只是希望能够获得列2-5的总和,无论列是否具有值,这就是我将BigDecimal初始化为ZERO

的原因

即使在第6列,它似乎也是监听表模型的变化。我不知道如何选择tablechanged适用的特定列。

感谢。

1 个答案:

答案 0 :(得分:1)

我已经解决了我的问题。很抱歉问这个。解决方案很简单。我做了一些研究,发现了一种名为e.getColumn()

的方法

非常感谢您查看我的问题。

@Override
    public void tableChanged(TableModelEvent e) {
        int colChanged = e.getColumn();
        if (colChanged == 2|| colChanged == 3 || colChanged == 4 || colChanged == 5) {
            DefaultTableModel tableModel = (DefaultTableModel) e.getSource();
            if (tableModel.getRowCount() > 0) {
                for (int row = 0; row < tableModel.getRowCount(); row++) {
                    BigDecimal sum = new BigDecimal(BigInteger.ZERO).setScale(2, RoundingMode.HALF_UP);
                    for (int col = 0; col < tableModel.getColumnCount(); col++) {
                        if (col == 2 || col == 3 || col == 4 || col == 5) {
                            if (tableModel.getValueAt(row, col) != null) {
                                sum = sum.add(new BigDecimal(Double.parseDouble(tableModel.getValueAt(row, col).toString())));
                            }
                        }
                    }
                    JOptionPane.showMessageDialog(null, "Sum: " + sum);
                    tableModel.setValueAt(sum, row, 6);
                }
            }
        }
    }