Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    Aiuto con funzione calcolo su JTable aiuto per favore

    Salve ragazzi ho un problema.

    Ho una JTable che viene inizializzata con un query ad un database.

    La tabella contiene tante righe quanti sono i record del database e 2 colonne

    nella colonna 0 ci sono gli elementi del database nella colonna 1 io posso inserire dei numeri.


    Ora il mio obiettivo è l'utente deve inserire dei numeri fino la cui somma è 100, appena la somma è 100 può attraverso un pulante lanciare una query.

    Ricapitolando.

    All'avvio la jtable viene popolata ad esempio con 100 righe poichè 100 sono gli elementi del database e 2 colonne standard.

    Io devo inserire dei numeri nella colonna 1. La somma di questi numeri deve essere 100, appena arrivata a 100 devo abilitare un botton che mi consente di generare la query.

    Il mio problema è che non riesco a perfezionare l'algoritmo che mi consente di controllare che il la somma non superi il 100.

    Detto ciò, io devo con il pulsante salva lanciare tante query quante sono le righe in cui ho inserito un numero.

    Ad esmepio ho le 100 righe io inserisco alla riga 10 colonna 1 il numero 90
    alla riga 50 colonna 1 il numero 10

    la somma è 100 a sto punto devo lanciare una query prendendo i dati dalla riga dove sta il 90 e la riga dove sta il 10.

    Posto un po di codice della mia tabella

    codice:
    class TableExample extends JTable {
          	
          	double somma=0;
            private class MyMouseAdapter extends MouseAdapter {
            	
                public void mouseClicked(MouseEvent me) {
              	  
                	TableExample t = (TableExample)me.getSource();
                        int row = t.rowAtPoint(me.getPoint());
                        int column = t.columnAtPoint(me.getPoint());          
                        System.out.println("La colonna selezionata è la " + column);
                        System.out.println("La riga selezionata è la " + row);
                    }
                }
    
            public boolean isCellEditable(int row, int column) {
                return true;
            }
            public Class getColumnClass(Float columnIndex) {
    	        return Float.class;    // Le due colonne sono numeri interi
    	    }
            
            public TableExample(Vector v, Vector n) {
                super(v, n);            
                this.addMouseListener(new MyMouseAdapter());
            }
            
            public void selectCell(int row,int col)
            {
                 if(row!=-1 && col !=-1)            
                  {
                  table.setRowSelectionInterval(row,row);
                  table.setColumnSelectionInterval(col,col);
                  }
            }
            public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    	        super.setValueAt(aValue, rowIndex, columnIndex);
    
    	        if (columnIndex == 1) {
    	        	String elemento = this.getValueAt(rowIndex,1).toString();
    	        	System.out.println("L'elemento che mi hai scritto vale " + elemento);
    	        	double element = Double.parseDouble(elemento);
    	        	somma +=element;
    	        	if(somma>100)
    	        	{
    	        		JOptionPane.showMessageDialog(getRootPane(), "Attenzione la somma degli zuccheri non può superare 100","Eccesso",JOptionPane.WARNING_MESSAGE);
    	        	    somma -= element;
    	        	    buttons.setEnabled(false);
    	        	    super.setValueAt("",rowIndex,1);
    	        	}
    	        	else{
    	        		if(somma ==100)
    	        		{
    	        			buttons.setEnabled(true);
    	        		}
    	        	}
    	        }
    	    }//fine metodo setValueAt
            
           
            
        }
    
    			
    }
    spero mi possiate aiutare grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Credo ti convenga ascoltare sulla tabella http://download.oracle.com/javase/6/...lListener.html

    In sostanza, se ho capito bene, devi solamente leggere tutte le righe che contengono i numeri..no? Arrivato al 100, i numeri li riazzeri?
    Potresti creare una specie di "mappa", un array comunque, che contenga valori booleani, e a seconda di quelli "pescati" (quandi raggiungi 100) li setti su true (o false, vedi tu).

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Siccome so per esperienza che scrivere un TableModelListener può essere abbastanza seccante (le prime volte), ti posto un esempio con più o meno quello che vuoi fare tu (manca tutta la gestione di che cosa succede dopo l'aver totalizzato 100, ovvero quanto accade alla pressione del tuo famoso tasto). Non vuole assolutamente essere una guida (cosa per cui ti consiglio di guardare il link a cui ti hanno indirizzato e di fare qualche ricerca in internet), ma solo uno spunto.
    codice:
    import javax.swing.table.*;
    import javax.swing.event.*;
    import javax.swing.*;
    /**
     *
     * @author Andrea
     */
    public class JTableEvents extends JFrame {
    
    
        public JTable table;
        public int max = 100;
    
        public int applyCorrection(TableModel model, int row, int col) {
            int total = 0;
            for (int i = 0; i < model.getRowCount(); i++) {
                if (i != row) {
                    try {
                        total += Integer.parseInt((String)model.getValueAt(i, col));
                    }
                    catch (Exception e) {
                    }                
                }
            }
            return (max-total);
        }
        
        public int findTotal(TableModel model, int row, int col) {
            int total = 0;
            for (int i = 0; i < model.getRowCount(); i++) {
                    try {
                        total += Integer.parseInt((String)model.getValueAt(i, col));                    
                    }
                    catch (Exception e) {                    
                    }
                    //System.out.println("Parziale: "+total);            
            }
            //System.out.println("Totale: "+total);
            return total;
        }
    
        public JTableEvents() {
            super("Table Events Demo");
            this.setSize(400,300);
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            String[] colonne = {"Numero #", "Valore database 1", "Valore database 2"};
            Object[][] data = {
                {"", "Pere", "Ben mature"},
                {"", "Mele", "Bel colorito"},
                {"", "Mandarini", "Verdi"},
                {"", "Melograni", "Di stagione"}
            };
            table = new JTable(data, colonne);
            table.getModel().addTableModelListener(new TableModelListener() {
    
                public void tableChanged(TableModelEvent e) {
                    int row = e.getFirstRow();
                    int col = e.getColumn(); 
    // in verità questo poteva essere semplicemente 
    // int col = 0;
    // in quanto tutto avviene solo nella prima colonna.
                    TableModel model = (TableModel)e.getSource();                
                    int total = findTotal(model, row, col);
                    
                    if (total > max) {
                        int newValue = applyCorrection(model, row, col);
                        model.setValueAt(newValue, row, col);
                    }
                }
            });
            this.getContentPane().add(new JScrollPane(table));
            this.setVisible(true);
        }
    
        public static void main (String[] args) {
            new JTableEvents();
        }
    
    }
    buon divertimento.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.