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ò