2013-07-11 28 views
0

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

+0

1)为了更好地帮助越早,张贴[SSCCE(http://sscce.org/)。 2)*“我怎样才能做到这一点?”* [你有什么尝试?](http://www.whathaveyoutried.com/) –

+0

你让Swing类管理所有东西使事情变得过于复杂。为什么你使用'DefaultTableModel'而不是自定义模型来管理一个知道如何计算自己小计的支付列表?我假设'total'是一个'JLabel'。因此,让标签监听“TableModelEvent”。 –

+1

使用['TableModelListener'](http://docs.oracle.com/javase/7/docs/api/javax/swing/event/TableModelListener.html),它会告诉你什么时候表模型被更改。然后,您可以使用该信息更新小计,而不需要遍历整个表... – MadProgrammer

回答

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

+0

谢谢..将尝试...因为我是JTable新手..所以对于我的代码我有点混淆。无论如何..感谢帮助! – Q123Q

+0

@ Q123Q'JTable'和'JTree'是Swing API中最复杂的组件(可能包含使用'StyledDocuments'的文本组件)。如果你可以对它们感到满意,那么你很快就会理解API的概念 – MadProgrammer