每次在JTable中添加新行时计算小计 [英] Calculate the subtotal while every time adding a new row in JTable

查看:61
本文介绍了每次在JTable中添加新行时计算小计的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How to calculate the subtotal while every time adding a new row in 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的新手.当我添加第一行时,它不会获得子总计值并将其显示在我的文本字段中.就在我添加第二行时,它将获得子总计值并插入到我的文本字段中,而在添加第三行时,它将开始计算第二行和第三行的子总计,它将不包括第一行.我该如何实现?

I am new to JTable. While I am adding the 1st row, it wont get the sub total value and display it in my text field. Just when i adding the second row it will just get the sub total value and insert into my text field and while adding 3rd row, it just start calculate the sub total of my 2nd row and 3rd row, it wont include the 1st row. How can I achieve this?

推荐答案

执行此操作的方法可能很多,这取决于您对最终实现方式的要求,但是在我看来,您想要为了最大程度地减少每次添加新行时需要在表上执行的迭代次数...

There are probably a number of ways to do this and it will come down to your requirements about how you would finally achieve it, but to my mind, you want to minimize the number of iterations you need to perform over the table each time a new row is added...

例如,如果仅添加一行,就没有必要遍历整个表.效率低下.

There's no point iterating over the entire table if only one row was added, for example. It's inefficient.

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

Instead, you could use TableModelListener and listen for updates to the table model and update a running total (adding the new row values to already running total).

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

    }
}

看看如何使用表,特别是监听数据更改

这篇关于每次在JTable中添加新行时计算小计的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆