Ho fatto qualcosa di simile tempo fa... e per rendere la cosa un pò più carina ho ragionato sul metodo propertyChange della JTable, in modo da aggiornare la somma in "tempo reale" L'unica cosa che manca è un controllo "come si deve" sui valori inseriti (viene controllato solo se vengono inseriti il . o la , per i decimali...)

tralasciando tutta l'inizializzazione grafica i metodi che possono esserti utili sono:

- un primo metodo per la costruzione della JTable
codice:
private void createMyJTable() {
        // in un qualche modo tiri fuori due array di questo tipo:
        String[] columnNames = {"","Prodotto X","Prodotto Y","Prodotto Z"}; //lascio la prima colonna vuota
        String[] clienti = {"Cliente 1","Cliente 2","Cliente 3","Cliente 4","","TOTALI"}; //aggiungo due righe alla fine
        Object[][] cellData = new Object[clienti.length][columnNames.length];
        
        //costruisco la griglia mettendo in prima colonna i clienti
        for(int i=0;i<clienti.length;i++){
            cellData[i][0] = clienti[i];
            for(int k=1;k<columnNames.length;k++){
                cellData[i][k] = "";
            }
        }
        
        ProvaJTableMyTableModel tModel = new ProvaJTableMyTableModel(cellData,columnNames);
        tModel.setLastRow(clienti.length-1);
        
        table.setModel(tModel);
    }
- Occorre definire un proprio modello per la tabella per evitare di editare celle non utili
codice:
import java.util.Vector;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class ProvaJTableMyTableModel extends DefaultTableModel
  {
    private Object[][] data;
    private String[] names;
    private int lastRow = 0;

    
    public ProvaJTableMyTableModel(Object[][] data,String[] names){
        super(data,names);
    }
    
    
    
    public ProvaJTableMyTableModel(){
        super();
    }
    

    
    
    public boolean isCellEditable( int row, int col ){
      if (row<lastRow-1 && col>0)
            return true;
      else
        return false;
    }
    public Class getColumnClass(int c) {
        return getValueAt(0, c).getClass();
    }


    public int getLastRow() {
        return lastRow;
    }

    public void setLastRow(int lastRow) {
        this.lastRow = lastRow;
    }
  }
- infine definire il metodo che cattura l'evento di scrittura nelle celle editabili:
codice:
private void tablePropertyChange(java.beans.PropertyChangeEvent evt) {                                     
        int rowIndex = table.getSelectionModel().getAnchorSelectionIndex();
        int vColIndex = table.getColumnModel().getSelectionModel().getAnchorSelectionIndex();
        int rows=table.getModel().getRowCount()-2;
        double somma = 0;
        if(vColIndex!=-1){
            for(int i=0;i<rows;i++){
                Object value = table.getValueAt(i,vColIndex);
                value = value!=null && !value.equals("") ? value.toString().replaceAll(",","\\.") : "0";
                somma += Double.parseDouble(value.toString());
            }

            table.setValueAt(somma,table.getModel().getRowCount()-1,vColIndex);
        }
        
    }     

table.addPropertyChangeListener(new java.beans.PropertyChangeListener() {
            public void propertyChange(java.beans.PropertyChangeEvent evt) {
                tablePropertyChange(evt);
            }
        });
Viene fuori una cosa del genere:

Spero possa servirti a qualcosa tutto ciò