我创建了一个监听特定列的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
适用的特定列。
感谢。
答案 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);
}
}
}
}