Problème de JTable

Résolu
greglover Messages postés 58 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 10 mars 2008 - 12 juin 2007 à 22:41
greglover Messages postés 58 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 10 mars 2008 - 13 juin 2007 à 01:12
Bonsoir,

j'ai un problème avec une classe importante de mon programme, problème que je n'arrive pas à résoudre sauf en "trichant un peu" ce qui double le temps d'execution du traitement (pas cool)

donc en gros j'ai une table récupérant les infos de la bdd
l'utilisateur fait ses modifications et hop la table est parsé et les valeurs renvoyés à la bdd (update)

La dernière colonne (montant facture) de la table est calculée en fonction des 3 colonnes précédentes (garderie matin, soir et mercredi).

Si je suis le traitement :

initialisation :
- je rempli la table (select)
- calcul la dernière colonne (à y réfléchir je sais pas pkoi puisque le champ garderie total enfant est justement ce montant calculé)
là, l'utilisateur entre les valeurs puis...
clic sur valider :
met à jour la bdd (update)
relance initialisation

Je me retrouve à ce moment là avec les valeurs de garderie affichées dans le tableau et entrées dans la bdd (vérification faîtes) mais le montant total qui est bien affiché dans la dernière colonne n'est pas dans la bdd.. Pour qu'il y soit j'ai alors deux solutions : soit je triche comme je l'ai fais en ajoutant un update(false) (false permettant de faire le traitement silencieusement) soit je reclic sur valider et alors le montant total est, cette fois, présent dans la bdd.

Je ne vois pas ou est mon erreur et je désespère de trouver la solution.

J'espère que quelqu'un pourra m'aider.

Cordialement

Voici la classe complète (sauf bouton inutile à la compréhension du problème) pour que vous puissiez voir l'évolution du traitement :

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.util.Date;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.ResultSet;
import com.mysql.jdbc.ResultSetMetaData;
import com.mysql.jdbc.Statement;

public class Garderie extends JPanel {

    private static final long serialVersionUID = 1L;
   
    private Montalembert fenetre;

    private JPanel entete;
   
    private JPanel main;
   
    private JScrollPane scrollPane;
   
    public JTable table = new JTable();
   
    private JButton btn_valider = null;

   
    /**
     * This is the default constructor
     */
    public Garderie(Montalembert m) {
        fenetre = m;
        setLayout(new BorderLayout());
        setBounds(new Rectangle(0, 0, 800, 570));
        add(getEntete(), BorderLayout.NORTH );
    }
   
    private JPanel getEntete() {
        if (entete == null) {
            entete = new JPanel();
            entete.setLayout(null);
            entete.setPreferredSize(new Dimension(800, 30));
            entete.add(getBtn_valider(), null);
        }
        return entete;
    }
   
    private JPanel getMain() {
        if (main == null) {
            main = new JPanel();
            main.setSize(800, 570);
            main.setLayout(new BorderLayout());
            scrollPane = new JScrollPane(table);
            scrollPane.setBorder(null);
            scrollPane.setPreferredSize(new Dimension(800, 570));
            main.add(scrollPane, BorderLayout.CENTER);
        }
        return main;
    }

    public void garderie()
    {
        try {
            setSize(800, 570);
            Vector columnNames = new Vector();
            Vector data = new Vector();
            try
            {
                  // Se connecter à la base de donnée
                  Class.forName("com.mysql.jdbc.Driver");
                  Connection connection = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/test_prog","root","" );
                 
                  // Récupérer les données des élèves
                  Statement stmt = (Statement) connection.createStatement();                  String sql "SELECT nom_enfant,prenom_enfant,classe_enfant,garderie_matin_enfant,garderie_soir_enfant,garderie_mercredi_enfant,garderie_total_enfant FROM enfant WHERE `garderie_enfant` 'true' AND sortie_enfant='' ORDER BY classe_enfant DESC,nom_enfant,prenom_enfant";
                  ResultSet rs = (ResultSet) stmt.executeQuery( sql );
                 
                  // Récupérer le titre des colonnes
                  ResultSetMetaData md = (ResultSetMetaData) rs.getMetaData();
                 
                  // Récupérer le nombre de colonne
                  int columns = md.getColumnCount();

                  // Récupérer le nom des colonnes
                  for (int i = 1; i <= columns; i++)
                  {
                      if (i==7){columnNames.addElement("MONTANT TTC");break;}
                      columnNames.addElement( md.getColumnName(i).replace("_enfant", "").replace("_", " ").replace("garderie", "gard.").toUpperCase());
                  }

                  // Récupérer les données des colonnes
                  // 1. Test si ya quelquechose à lire, donc test si la classe existe
                  // 2. Remet le pointeur au début
                  // 3.Tant qu'il y a quelquechose à lire
                  if (rs.next())
                  {
                      rs.beforeFirst();
                      while (rs.next())
                      {
                          fenetre.setCourantPanel(Garderie.this);
                          Vector row = new Vector(columns);
                         
                          //récupération des valeurs de la bdd
                          //prépare la ligne
                          for (int i = 1; i <= columns; i++)
                          {
                                  row.addElement( rs.getString("nom_enfant") );
                                  row.addElement( rs.getString("prenom_enfant") );
                                  row.addElement( rs.getString("classe_enfant") );
                                  row.addElement( rs.getString("garderie_matin_enfant") );
                                  row.addElement( rs.getString("garderie_soir_enfant") );
                                  row.addElement( rs.getString("garderie_mercredi_enfant"));
                                  row.addElement( rs.getString("garderie_total_enfant"));   
                          }
                          // ajoute la ligne
                          data.addElement( row );
                      }
                  }
                  else
                  {
                      JOptionPane.showMessageDialog(null, "Problème de base de donnée !!!", "Erreur", JOptionPane.ERROR_MESSAGE);
                  }
                  // Tout fermer
                  rs.close();
                  stmt.close();
            }
            catch(Exception e){}
           
            // Créer la table avec les données de la base
            TableModelCustom model = new TableModelCustom(data, columnNames);
           
            // Rends certaines colonnes éditables
            model.addEditableColumn(3);
            model.addEditableColumn(4);
            model.addEditableColumn(5);
           
            // Application du modèle au tableau
            table.setModel(model);
           
            // Redimensionne
            for (int i=0;i<=6;i++)
            {
                TableColumn column = table.getColumnModel().getColumn(i);
                switch (i)
                {
                    case 0:column.setMaxWidth(160);column.setMinWidth(140);break;
                    case 1:column.setMaxWidth(120);column.setMinWidth(100); break;
                    case 2:column.setMaxWidth(80);column.setMinWidth(60);break;
                    case 3:column.setMaxWidth(110);column.setMinWidth(100); break;
                    case 4:column.setMaxWidth(110);column.setMinWidth(100);break;
                    case 5:column.setMaxWidth(115);column.setMinWidth(100); break;
                    case 6:column.setMaxWidth(100);column.setMinWidth(75); break;
                }
            }
           
            // Centre le contenu des cellules
            DefaultTableCellRenderer custom = new DefaultTableCellRenderer();
            custom.setHorizontalAlignment(SwingConstants.CENTER);
            for (int k=0; k < table.getColumnCount(); k++) {
               table.getColumnModel().getColumn(k).setCellRenderer(custom);
            }
           
            // Autorise le redimensionnement manuel et interdit le déplacement de colonne
            table.getTableHeader().setReorderingAllowed(false);
            table.getTableHeader().setResizingAllowed(true);
        }
        catch (Exception e) {}

        go_calcul();
       
        // ajout du panneau
        add(getMain(), BorderLayout.CENTER);
    }
   
    public void go_calcul()
    {
        Calcul_garderie un_calcul = new Calcul_garderie();
        for (int j = 0 ; j < table.getRowCount() ; j++)
        {
            DecimalFormat df = new DecimalFormat("########.00");
            double montant=un_calcul.calculer(table.getValueAt(j, 0).toString(),table.getValueAt(j, 1).toString());
            if (montant!=0) {
                table.setValueAt(df.format(montant), j, 6);
            }
        }
    }
   
    public void update(boolean confirm)
    {
        DataBaseImpl base = new DataBaseImpl();
        base.setParametre("127.0.0.1","root","","test_prog");
        try
        {
            base.open();
            // parse
                for (int j = 0 ; j < table.getRowCount() ; j++)
                {                    base.execute("UPDATE `enfant` SET garderie_matin_enfant "+table.getValueAt(j, 3)+" , garderie_soir_enfant "+table.getValueAt(j, 4)+" , garderie_mercredi_enfant = "+table.getValueAt(j, 5)+", garderie_total_enfant = '"+table.getValueAt(j, 6).toString().replace(",",    ".")+"' WHERE nom_enfant = '"+table.getValueAt(j, 0).toString().replace("'", "''")+"' AND prenom_enfant = '"+table.getValueAt(j, 1).toString().replace("'", "''")+"'");
                }
            base.close();
            if (confirm){
                JOptionPane.showMessageDialog(null, "Modification prise en compte", "Confirmation", JOptionPane.INFORMATION_MESSAGE);
            }
        }
        catch(DataBaseException dbe)
        {
            JOptionPane.showMessageDialog(null, "Problème de base de donnée !!!", "Erreur", JOptionPane.ERROR_MESSAGE);
        }
    }
   
    /**
     * This method initializes btn_valider  
     *    
     * @return javax.swing.JButton   
     */
    private JButton getBtn_valider() {
        if (btn_valider == null) {
            btn_valider = new JButton();
            btn_valider.setBounds(new Rectangle(570, 5, 101, 19));
            btn_valider.setForeground(new Color(108, 3, 125));
            btn_valider.setText("Valider");
            btn_valider.setToolTipText("Valider");
            btn_valider.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent e) {
                   
                    update(true);                   
                    garderie();
                    update(false); <= la triche est ici

                   
                    btn_imprimer.setVisible(true);
                    lbl_intitule.setText("< = Et voilà !!!");
                }
            });
        }
        return btn_valider;
    }
}

1 réponse

greglover Messages postés 58 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 10 mars 2008
13 juin 2007 à 01:12
en fait j'ai résolu mon problème, c'est parce que ma classe Calcul calculait à partir de la bdd et non de la JTable

merci quand même
3
Rejoignez-nous