每次在JTable中添加新行时计算小计

如何在每次在JTable添加新行时计算小计?

 DefaultTableModel model = (DefaultTableModel) jTable1.getModel(); int i = 0; double total123 = 0.0; int Row = model.getRowCount(); Payment pm = new Payment(); double sub_total123; //calculate sub_total;;; sub_total123 = Double.parseDouble(unit_price.getText()) * Integer.parseInt(order_quantity.getText()); pm.setSub_total(sub_total123); sub_total.setText(Double.toString(pm.getSub_total())); if (Row < 10) { model.addRow(new Object[]{product_id.getText(), product_name.getText(), Integer.parseInt(order_quantity.getText()), Double.parseDouble(unit_price.getText()), Double.parseDouble(sub_total.getText())}); } for (i = 0; i < Row; i++) { total123 += ((Double) jTable1.getValueAt(i, 4)).doubleValue(); total.setText(Double.toString(total123)); } 

我是JTable新手。 当我添加第一行时,它不会获得子总值并将其显示在我的文本字段中。 就在我添加第二行时,它将获得子总值并插入到我的文本字段中,同时添加第三行,它只是开始计算我的第二行和第三行的子总数,它不包括第一行。 我怎样才能做到这一点?

可能有很多方法可以做到这一点,它将归结为您最终如何实现它的要求,但在我看来,您希望最小化每次新表时需要执行的迭代次数行被添加…

例如,如果只添加了一行,则无需迭代整个表。 效率低下。

相反,您可以使用TableModelListener并侦听表模型的更新并更新运行总计(将新行值添加到已运行的总计)。

在此处输入图像描述

 import java.awt.BorderLayout; import java.awt.Component; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.event.TableModelEvent; import javax.swing.event.TableModelListener; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; public class SubTotalTable { public static void main(String[] args) { new SubTotalTable(); } public SubTotalTable() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JLabel subTotal; private DefaultTableModel tableModel; private double runningTally = 0; public TestPane() { setLayout(new BorderLayout()); tableModel = new DefaultTableModel(new Object[]{"Price"}, 0); JTable table = new JTable(tableModel); table.getColumnModel().getColumn(0).setCellRenderer(new CurrencyRenderer()); add(new JScrollPane(table)); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.weightx = 1; JButton charge = new JButton("Charge"); charge.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { double subTally = 0; double tally = runningTally; int rows = (int) (Math.round(Math.random() * 9) + 1); for (int row = 0; row < rows; row++) { double amount = (Math.random() * 99999) + 1; tableModel.addRow(new Object[]{amount}); tally += amount; subTally += amount; } System.out.println("subTally = " + subTally); System.out.println("tally = " + tally); } }); panel.add(charge, gbc); gbc.gridx++; gbc.weightx = 0; subTotal = new JLabel(getRunningTallyDisplayValue()); panel.add(subTotal, gbc); add(panel, BorderLayout.SOUTH); tableModel.addTableModelListener(new TableModelListener() { @Override public void tableChanged(TableModelEvent e) { switch (e.getType()) { case TableModelEvent.DELETE: System.out.println("Delete"); break; case TableModelEvent.INSERT: System.out.println("Insert"); for (int row = e.getFirstRow(); row <= e.getLastRow(); row++) { Object value = tableModel.getValueAt(row, 0); if (value instanceof Double) { runningTally += (double)value; } } break; case TableModelEvent.UPDATE: System.out.println("Update"); break; } subTotal.setText(getRunningTallyDisplayValue()); } }); } protected String getRunningTallyDisplayValue() { return NumberFormat.getCurrencyInstance().format(runningTally); } @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } } public class CurrencyRenderer extends DefaultTableCellRenderer { public CurrencyRenderer() { setHorizontalAlignment(JLabel.RIGHT); } @Override public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (value instanceof Double) { value = NumberFormat.getCurrencyInstance().format(value); } super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); return this; } } } 

看看如何使用表格 ,特别是倾听数据变化