IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 Java Discussion :

Calcul de total en bas de colonne d'un Jtable


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Economiste
    Inscrit en
    Décembre 2016
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Bénin

    Informations professionnelles :
    Activité : Economiste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut Calcul de total en bas de colonne d'un Jtable
    Bonjour,
    je suis entrain de développer une application swing me permettant de gérer les opérations d'une caisse. Dans mon projet, je souhaite avoir le total de chaque colonne d'un Jtable à la dernière ligne de celle-ci. Pour y parvenir, je charge mes données à partir d'une base MySQL dans le Jtable puis je veut pouvoir modifier la dernière ligne du Jtable en y ajoutant le total de chaque colonne. Après que j'ai écrit mon code, les données s'affiche dans le Jtable mais le total ne s'affiche pas. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    public class CalculTotalSwing extends JFrame {
     
    	private JPanel contentPane;
    	private JTable table;
    	private JTextField textField;
    	private JDateChooser dateDebut;
    	private JDateChooser dateFin;
    	private DefaultTableModel model;
    	private TableModelListener tableModelListener;
     
    	/**
             * Launch the application.
             */
    	public static void main(String[] args) {
    		EventQueue.invokeLater(new Runnable() {
    			public void run() {
    				try {
    					CalculTotalSwing frame = new CalculTotalSwing();
    					frame.setVisible(true);
    				} catch (Exception e) {
    					e.printStackTrace();
    				}
    			}
    		});
    	}
     
    	/**
             * Create the frame.
             */
    	public CalculTotalSwing() {
    		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    		setBounds(100, 100, 769, 577);
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		contentPane.setLayout(null);
     
    		JScrollPane scrollPane = new JScrollPane();
    		scrollPane.setBounds(107, 109, 636, 419);
    		contentPane.add(scrollPane);
     
    		table = new JTable();
    		scrollPane.setViewportView(table);
    		table.getModel().addTableModelListener(tableModelListener);
     
    		JButton btnRecherche = new JButton("Recherche");
    		btnRecherche.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent arg0) {
    				resultat();
    				 setTableModelListener();
    			}
    		});
    		btnRecherche.setBounds(10, 21, 89, 23);
    		contentPane.add(btnRecherche);
     
    		textField = new JTextField();
    		textField.setBounds(122, 22, 86, 20);
    		contentPane.add(textField);
    		textField.setColumns(10);
     
    		JLabel lblPriode = new JLabel("P\u00E9riode");
    		lblPriode.setBounds(291, 25, 54, 14);
    		contentPane.add(lblPriode);
     
    		dateDebut = new JDateChooser();
    		dateDebut.setBounds(370, 21, 102, 20);
    		contentPane.add(dateDebut);
     
    		dateFin = new JDateChooser();
    		dateFin.setBounds(516, 21, 102, 20);
    		contentPane.add(dateFin);
     
     
    	}
     
     
    	public void resultat(){
    		MetierImpl metier=new MetierImpl();
    		Date date=dateDebut.getDate();
    		Date date1=dateFin.getDate();
    		java.sql.Date sqlDate = new java.sql.Date(date.getTime());
    		java.sql.Date sqlDate1 = new java.sql.Date(date1.getTime());
     
    		model = new DefaultTableModel() {
    			@Override
    			public boolean isCellEditable(int row, int column) {
    				return row!= getRowCount()-1;
    			}
    			@Override
    			public Class<?> getColumnClass(int columnIndex) {
    				return Integer.class;
    			}
    		};
    		model.setColumnIdentifiers(new Object[]{"Date","Entré","Sortie"});
    		Object[] rows=new Object[3];
     
    		Vector v=new Vector<>();// Vecteur qui permettra d'ajouter une dernière ligne dans la table.
       	    v.add("Total");
     
       	    List<Operations> operation=metier.consulterOperations(sqlDate, sqlDate1);//Création de la liste d'operation à partir de la base de donné
       	    //Chargement de données dans le tableau
    		for(Operations op:operation){
    			rows[0]=op.getDATE_OP();
    			rows[1]=op.getENTRE();
    			rows[2]=op.getSORTIE();
     
    			model.addRow(rows);
     
    		}
    		model.addRow(v);// ajout de la dernière ligne au model
    		table.setModel(model);
     
     
    	}
    	private void setTableModelListener() {
            tableModelListener = new TableModelListener() {
                public void tableChanged(TableModelEvent e) {
                	int lastRow = model.getRowCount() - 1; // dernière ligne
     
                	if (e.getType() == TableModelEvent.UPDATE && e.getFirstRow() < lastRow && e.getLastRow() < lastRow && e.getColumn()==1) {
     
                		int row = lastRow;
                		int totalEntre = 0;
    	            	int totalSortie = 0; // on initialise le résultat
    	            	for (int i = 0; i < row; i++) {
     
    	            	    if ( e.getFirstRow()>=i && i<=e.getLastRow() ) {
     
    	            	    	totalEntre += (int) model.getValueAt(i, 1); // calcul total de la colonne
    	            	    	totalSortie += (int) model.getValueAt(i, 2); // calcul total de la colonne
    	            	     }
     
    	            	}
    	            	model.setValueAt(totalEntre, lastRow, 1); // après la boucle on modifie la cellule censé contenir le total
    	            	model.setValueAt(totalSortie, lastRow, 2); // après la boucle on modifie la cellule censé contenir le total
                	}
     
     
                    }
     
              };
     
        }
    }
    Merci d'avance pour tout apport.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,


    1. Ligne table.getModel().addTableModelListener(tableModelListener);Déjà, tu affectes l'écouteur de modèle avant même de l'instancier et d'affecter la variable tableModelListener (je suis étonné que tu n'aies pas de NullPointerException).
      En plus tu changes le modèle dans l'ActionListener de btnRecherche. Donc même si tu avais bien un écouteur sur l'ancien modèle, il n'y en aurait plus sur le nouveau.
      Déplace simplement cette ligne dans ta méthode setTableModelListener, à la fin.

    2. L'écouteur réagit lors que l'évenement est déclenché. Donc si tu l'enregistres sur le modèle après avoir charger tes données, ça ne changera rien (il ne réagira pas, donc ça ne calculera donc pas les totaux). On ne peut pas l'enregistrer avant, puisque les totaux doivent être à la fin. Ou alors il faudrait insérer les lignes avant la dernière, mais ça déclencherait autant de fois le calcul de totaux que de lignes, ce qu'il vaut mieux éviter. Pour résoudre le problème, extraire le calcul dans une méthode à part que tu pourras invoquer au chargement initial du modèle. Cette même méthode sera également invoquée par la méthode talbeChange de l'écouteur.

    3. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      if ( e.getFirstRow()>=i && i<=e.getLastRow() ) {
       
      	            	    	totalEntre += (int) model.getValueAt(i, 1); // calcul total de la colonne
      	            	    	totalSortie += (int) model.getValueAt(i, 2); // calcul total de la colonne
      	            	     }
      à chaque mise à jour dans la table, tu calcules uniquement le total des lignes modifiées, alors que je suppose que tu veux le total de toutes les lignes, non ? Il faut l'enlever. Cela permettra en plus plus facilement d'extraire la méthode de calcul du total
    4. Alternative 1:
      faire un modèle spécifique.
    5. alternative 2: utiliser un "column footer" en s'aidant avec de Jide. Voir exemple ici. Avantage : le total est toujours visible, même si toutes les données de la table ne sont pas visibles en même temps.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Homme Profil pro
    Economiste
    Inscrit en
    Décembre 2016
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Bénin

    Informations professionnelles :
    Activité : Economiste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Merci pour votre reponse très explicite. Pour ce qui concerne vos remarques, au faite je me suis inspiré d'une de vos discusion dans ce forum pour écrire ce code.
    Après avoir prise en compte vos recommandations, les totaux s'affiches quand je clic sur une case de mon Jtable comme si je le modifiait. Mais je souhaite que ces totaux s'affiche automatiquement à l'affichage du Jtable. Pour l'usage de Jide, sur mon poste, j'utilise le JDK 8 avec eclipse comme outils de travail. Est ce que cela peut marché ? Une fois encore merci.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par afkiba Voir le message
    Après avoir prise en compte vos recommandations, les totaux s'affiches quand je clic sur une case de mon Jtable comme si je le modifiait. Mais je souhaite que ces totaux s'affiche automatiquement à l'affichage du Jtable.
    Je te l'ai dit : s'il n'y a que ton écouteur qui calcule les totaux tu n'auras pas de total à l'iniitialisation. Quand tu cliques dans une case comme tu dis, ça provoque une édition, ce qui déclenche l'écouteur indirectement.
    Il faut extraire le calcul du total pour pourvoir l'appeler également à l'initialisation.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private void calculTotaux() {
     
               	int lastRow = model.getRowCount() - 1; // dernière ligne
     
                		int totalEntre = 0;
    	            	int totalSortie = 0; // on initialise le résultat
    	            	for (int i = 0; i < lastRow; i++) {
     
    	            	    	totalEntre += (int) model.getValueAt(i, 1); // calcul total de la colonne
    	            	    	totalSortie += (int) model.getValueAt(i, 2); // calcul total de la colonne
     
    	            	}
    	            	model.setValueAt(totalEntre, lastRow, 1); // après la boucle on modifie la cellule censé contenir le total
    	            	model.setValueAt(totalSortie, lastRow, 2); // après la boucle on modifie la cellule censé contenir le total
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    tableModelListener = new TableModelListener() {
                public void tableChanged(TableModelEvent e) {
                	int lastRow = model.getRowCount() - 1; // dernière ligne
     
                	if ((e.getType() == TableModelEvent.UPDATE || e.getType() == TableModelEvent.DELETE || e.getType() == TableModelEvent.INSERT ) && e.getFirstRow() < lastRow && (e.getColumn()==1 || e.getColumn()==2)) { // si la colonne 1 ou 2 d'une ligne autre que la dernière (celle des totaux) change alors
     
                            calculTotaux(model); 
               	}
     
     
     
              };
    Et à l'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    public void resultat(){
     
       ...
     
       List<Operations> operation=metier.consulterOperations(sqlDate, sqlDate1);//Création de la liste d'operation à partir de la base de donné
       //Chargement de données dans le tableau
       for(Operations op:operation){
            rows[0]=op.getDATE_OP();
    	rows[1]=op.getENTRE();
    	rows[2]=op.getSORTIE();
            model.addRow(rows);
       }
       model.addRow(v);// ajout de la dernière ligne au model
     
       calculTotaux(model); // on calcule les totaux pour les avoir dès le premier affichage
       setModelListener(); // on enregistre le listener pour que les totaux se mettent à jour ensuite
     
    }


    Citation Envoyé par afkiba Voir le message
    Pour l'usage de Jide, sur mon poste, j'utilise le JDK 8 avec eclipse comme outils de travail. Est ce que cela peut marché ? Une fois encore merci.
    Oui, peu importe que tu utilises Eclipse, c'est Java qui coimpte. Et ça fonctionne avec Java 8 (c'est d'ailleurs avec cette version que j'avais fait mon exemple). Il suffit de télécharger la bibliothèque (JIDE Common Layer) et la mettre dans le buildpath de ton projet. Pour télécharger la bibliothèque, il faudra télécharger d'une part la build sur maven (tu peux la retrouver par http://search.maven.org, en cherchant http://search.maven.org (attention, il y a des mises à jour récentes pour le JDK 9, il faudra peut-être prendre une version antérieure à la toute dernière) et d'autres part les jars que cette API utilise (à trouver dans le dossier lib du github https://github.com/jidesoft/jide-oss).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre confirmé
    Homme Profil pro
    Economiste
    Inscrit en
    Décembre 2016
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Bénin

    Informations professionnelles :
    Activité : Economiste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Vraiment merci, merci, une fois encore merci. Vous être géniale. ça a marché comme je le souhaite. Que vous récompense du don que vous nous faite dans ce forum. Je vais chercher à comprendre le Jide aussi.

  6. #6
    Membre confirmé
    Homme Profil pro
    Economiste
    Inscrit en
    Décembre 2016
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Bénin

    Informations professionnelles :
    Activité : Economiste
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Bonjour,
    je revient encore par rapport a mon Jtable. Après avoir faire affiché les totaux, je voulu imprimé le Jtable. Pour le faire j'ai utilisé la méthode getValueAt de Jtable pour récupérer toutes les informations contenu dans le Jtable afin de l'imprimé avec JasperReport. Mais cela ne marche pas. Quand j'enlève la dernière de if clause l'impression marche. Je pense que c'est le vecteur que j'ai utilisé pour ajouter la dernière de mon Jtable qui pose le problème. Là je suis bloqué et je ne s'ai plus quoi faire. Veuillez m'aidé s'il vous plais.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Calculer le total d'une colonne
    Par titiphp dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 30/06/2015, 11h47
  2. Calcul d'un ratio dans la colonne total
    Par datametric dans le forum Cognos
    Réponses: 3
    Dernier message: 18/03/2010, 10h12
  3. Faire un total en fin de colonne sous excel
    Par Daniel MOREAU dans le forum Access
    Réponses: 3
    Dernier message: 10/06/2006, 14h30
  4. Réponses: 1
    Dernier message: 11/04/2006, 15h41
  5. [rave report] Calculer un total
    Par webbulls dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2004, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo