Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 28
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225

    [Java] JTable: somma interi di una colonna

    Ciao a tutti!
    Sono alle prese con una JTable!
    A parte la prima colonna e la prima riga (colonna 0 e riga 0) ho degli interi che l'utente inserisce nella mia JTable.
    Quello che vorrei è che nell'ultima riga venissero visualizzate le somme degli interi di ogni colonna!
    E' possibile farlo? Se sì....in che modo?

    P.S. Non so a priori quante righe e colonne avrà la mia JTable, dipende da quanti "clienti" e da quanti "prodotti" (che ho salvato in due liste) l'utente ha inserito nel programma!
    GRAZIE IN ANTICIPO!

  2. #2
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    Vi spiego meglio come dovrebbe essere il mio programma, così magari potete darmi idee migliori di una JTable!

    Allora....il programma che sto costruendo dovrebbe servire per la gestione di un forno!!
    L'utente al primo accesso deve inserire i dati dei suoi clienti (codice, nome, indirizzo....etc) e i dati dei prodotti che vende (codice, nome, ingredienti del prodotto, percentuale degli ingredienti nell'impasto,....etc).
    E fin qui ci sono!!

    Ora manca la parte più importante: quella che calcola le dosi dei prodotti.

    Ogni cliente ogni giorno fa un ordine...!
    Per esempio MARIO ROSSI ordina 10 kg di PRODOTTO X;
    LUCA BIANCHI ordina altri 5 kg di PRODOTTO X;
    Perciò il fornaio la notte deve preparare 15 kg di PRODOTTO X;

    Ora il fornaio vuole sapere (dal mio programma!!!) quanta farina, acqua, sale, lievito...etc gli servono per fare quei 15 kg di PRODOTTO X!!

    Io allora ho pensato di fare una JTable che ha nella prima colonna (a partire dalla seconda riga) i NOMI DEI CLIENTI inseriti nel programma, e nella prima riga (a partire dalla seconda colonna) i NOMI DEI PRODOTTI. Le altre celle della JTable devono essere vuote ed editabili, cosicchè l'utente possa inserire l'intero 10 nella colonna dove ci sarà PRODOTTO X, alla riga in cui ci sarà MARIO ROSSI!! E così via per tutti gli altri clienti!

    L'ultima riga della JTable deve essere non editabile e ci devono venire le somme degli ordini per ogni prodotto (nel caso del PRODOTTO X ci deve venire 15)!
    Poi su ogni somma devo calcolarci le dosi di ogni ingrediente del prodotto (in base alla percentuale degli ingredienti inserita dall'utente!!!)

    E' un po' complicato lo so...!
    Spero di essere stata abbastanza chiara!
    La JTable è l'idea migliore secondo voi per inserire gli ordini dei clienti?
    Come mi consigliate di affrontare la cosa?

    GRAZIE MILLE!

  3. #3
    non so se ho capito bene ma questa potrebbe essere una soluzione
    Codice PHP:
    JTable t = new JTable();

            
    int righe t.getRowCount();
            
    int colonne t.getColumnCount();
            
    int somma 0;
            for (
    int i =i<colonne ;i++){
                for (
    int j=1j<righe-1j++){
                    
    somma += (Integer)t.getValueAt(ji);
                }
                
    t.setValueAt(sommarighei);
            } 

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    Grazie mille...domani provo!

  5. #5
    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ò

    Al mio segnale... scatenate l'inferno!

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    GRAZIE MILLE!
    Ho una domanda sola da farti: il metodo getValueAt() nella mia classe che estende AbstractTableModel come lo implemento?
    GRAZIE ANCORA!

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    Niente niente....ho già capito guardando attentamente il codice!
    GRAZIE MILLE!
    SEI STATO MOLTO GENTILE!

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    Il metodo per la costruzione della JTable e PropertyChange in che classe li definisco?
    GRAZIE!

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2005
    Messaggi
    225
    Ho fatto un po' di confusione!

    TABELLA ORDINI
    codice:
    import javax.swing.table.DefaultTableModel;
    
    public class TabellaOrdini extends DefaultTableModel {
        private Object[][] data;
        private String[] nomi;
        private int ultimaRiga = 0;
    
        /** Costruttore che inizializza la tabella passandole la matrice
         *  data e una stringa contenente i nomi delle colonne.
         */
        public TabellaOrdini(Object[][] data, String[] nomi) {
            super(data, nomi);
        }
        
        /** Costruttore che richiama il costruttore di default di
         *  DefaultTableModel (tabella con zero righe e zero colonne.
         */
        public TabellaOrdini() {
            super();
        }
        
        
        
        /** Specifica se le celle sono editabili. */
        public boolean isCellEditable(int row, int col) {
            if ((row < (ultimaRiga - 1)) &&  (col > 0)) return true;
            else return false;
        }
        
        /** Restituisce il valore dell'ultima riga. */
        public int getLastRow() {
            return ultimaRiga;
        }
        
        /** Inizializza il valore dell'ultima riga. */
        public void setLastRow(int lastRow) {
            ultimaRiga = lastRow;
        }
        
    }
    GESTIONE TABELLA ORDINI
    codice:
    import javax.swing.table.*;
    import javax.swing.*;
    
    public class GestioneTabellaOrdini {
        private ListNode CLIENTI, PRODOTTI;
        private JTable table;
    
        public GestioneTabellaOrdini(ListNode CLIENTI, ListNode PRODOTTI) {
            this.CLIENTI = CLIENTI;
            this.PRODOTTI = PRODOTTI;
            JTable table = new JTable();
        }
        
        public JTable creaTabellaOrdini() {
            
            GestioneProdotti gp = new GestioneProdotti();
            String[] nomiProdotti = gp.getNomiProdotti(PRODOTTI);
            int lunghezza = nomiProdotti.length;
            String[] Prodotti = new String[lunghezza + 1];
            Prodotti[0] = "";
            for (int i=1; i<=lunghezza; i++){
                Prodotti[i] = nomiProdotti[i-1];
            }
            
            GestioneClienti gc = new GestioneClienti();
            String[] nomiClienti = gc.getNomiClienti(CLIENTI);
            int lung = nomiClienti.length;
            String[] Clienti = new String[lung + 2];
            for (int i=0; i<lung; i++) {
                Clienti[i] = nomiClienti[i];
            }
            Clienti[lung] = "";
            Clienti[lung + 1] = "TOTALI";
            
            Object[][] datiCelle = new Object[Clienti.length][Prodotti.length];
            
            /** Costruisco la griglia mettendo in prima colonna i clienti. */
            for (int i=0; i<Clienti.length; i++) {
                datiCelle[i][0] = Clienti[i];
                for (int k=1; k<Prodotti.length; k++) {
                    datiCelle[i][k] = "";
                }
            }
            
            TabellaOrdini myTable = new TabellaOrdini(datiCelle, Prodotti);
            myTable.setLastRow(Clienti.length-1);
            
            table.setModel(myTable);
            return table;
            
            }
            
            public void tablePropertyChange(java.beans.PropertyChangeEvent evt) {
                
                int indiceRiga = table.getSelectionModel().getAnchorSelectionIndex();
                int indiceColonna = table.getColumnModel().getSelectionModel().getAnchorSelectionIndex();
                int righe = table.getModel().getRowCount()-2;
                float somma = 0;
                
                if (indiceColonna != -1) {
                    for (int i=0; i<righe; i++) {
                        Object valore = table.getValueAt(i, indiceColonna);
                        somma = somma + Float.parseFloat(valore.toString());
                    }
                    table.setValueAt(somma, table.getModel().getRowCount()-1, indiceColonna);
                }
            }
            
    }
    PANNELLO TABELLA
    codice:
    public class PannelloTabella extends JPanel {
        private ListNode CLIENTI, PRODOTTI;
        private JTable t;
        private JScrollPane scrollPane;
    
        public PannelloTabella(ListNode CLIENTI, ListNode PRODOTTI) {
            this.CLIENTI = CLIENTI;
            this.PRODOTTI = PRODOTTI;
            
            GestioneTabellaOrdini gt = new GestioneTabellaOrdini(CLIENTI, PRODOTTI);
            t = gt.creaTabellaOrdini();
            scrollPane = new JScrollPane(t);
            add(scrollPane);
            
        }
        
        
    }
    La tabella non viene visualizzata, in più il compilatore mi segnala questa eccezione:
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at GestioneTabellaOrdini.creaTabellaOrdini(GestioneTabellaOrdini.java:56)
        at PannelloTabella.<init>(PannelloTabella.java:24)
    Le righe interessate dall'eccezione sono quelle in rosso!

    Qualcuno può aiutarmi?
    GRAZIE MILLE!

  10. #10
    nel costruttore prova a fare cosi

    public GestioneTabellaOrdini(ListNode CLIENTI, ListNode PRODOTTI) {
    this.CLIENTI = CLIENTI;
    this.PRODOTTI = PRODOTTI;
    //invece di JTable table = new JTable();
    this.table= new JTable();
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.