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

时间:2013-07-11 04:32:19

标签: java swing 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的新手。当我添加第1行时,它不会获得子总值并将其显示在我的文本字段中。就在我添加第二行时,它将获得子总值并插入到我的文本字段中,同时添加第三行,它只是开始计算我的第二行和第三行的子总数,它不包括第一行。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:4)

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

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

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

enter image description here

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;
        }

    }
}

查看How to use tables,特别是Listening for Data Changes