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

  1. #1
    Membre confirmé
    Homme Profil pro
    Economiste
    Inscrit en
    Décembre 2016
    Messages
    114
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    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 : 56
    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 : 36
    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 : 56
    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 : 36
    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 : 36
    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.

  7. #7
    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 : 56
    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
    Quand j'enlève la dernière de if clause l'impression marche.
    Tu veux dire quand tu enlèves la dernière ligne, celle des totaux, c'est ça ?

    ça m'etonnerait pas que ça vienne du typage de la première colonne. Tu as dis que toutes les colonnes étaient du int
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    model = new DefaultTableModel() {
    			@Override
    			public boolean isCellEditable(int row, int column) {
    				return row!= getRowCount()-1;
    			}
    			@Override
    			public Class<?> getColumnClass(int columnIndex) {
    				return Integer.class;
    			}
    		};
    alors que dans la première colonne de la ligne de totaux tu as mis du String :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Vector v=new Vector<>();// Vecteur qui permettra d'ajouter une dernière ligne dans la table.
       	    v.add("Total");
    Sinon, JasperReport, j'y connais rien.
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Je vois ce que vous dites. Au faite toutes les colonnes ne sont pas des int. Ceux sont les deux dernière colonne s qui sont des int. Comment pourrai-je spécifier uniquement les deux derniers colonnes du model.

  9. #9
    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 : 56
    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
    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
    model = new DefaultTableModel() {
    			@Override
    			public boolean isCellEditable(int row, int column) {
    				return row!= getRowCount()-1;
    			}
    			@Override
    			public Class<?> getColumnClass(int columnIndex) {
                                    if ( columnIndex==0 ) {
                                       return Object.class; // le type des données de la première colonne
                                    }
                                    else {
    				  return Integer.class;
                                    }
    			}
    		};
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Au faite j'utilise l'exemple là dans un tableau qui comporte 7 colonnes dont seulement les deux derniers sont des int. j'ai fait ce-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
    					public boolean isCellEditable(int row, int column) {
    						return row!= getRowCount()-1;
    					}
    					@Override
    					public Class<?> getColumnClass(int columnIndex) {
    						if ( columnIndex==0 && columnIndex==1 &&columnIndex==2 &&columnIndex==3 &&columnIndex==4) {
                                return Object.class; // le type des données de la première colonne
                             }else{
                            	 return Integer.class;
                             }
    mais ça n'a pas marché. Comment je peux reformulé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( columnIndex==0 && columnIndex==1 &&columnIndex==2 &&columnIndex==3 &&columnIndex==4)

  11. #11
    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 : 56
    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
    C'est un ou (||) par un et (&&), parce columnIndex ne peut pas être égal à la fois à 0, à 1, à 2, à 3 et à 4.
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Merci pour votre aide. Mais ça n'a toujours pas marché. J'ai constaté que si je clic sur la dernier ligne, elle n'est pas éditable mais les autres le sont. Donc jusqu’à présent, je pense que c'est la dernière ligne qui pose le problème.

  13. #13
    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 : 56
    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
    La denière ligne n'est pas éditable à cause de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public boolean isCellEditable(int row, int column) {
    						return row!= getRowCount()-1;
    					}
    Mais c'est normal qu'elle ne soit pas éditable : c'est une ligne de totaux. Le fait que ça ne soit pas éditable n'a rien à voir avec la possiblité ou non d'imprimer. Ce serait n'importe quoi si JasperReport ne pouvait pas imprimer des lignes non éditables.
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Bonjour,
    Au regard de votre dernier message, je suis entrain de chercher la source réel de cette exception. Mais entendant, je ne sais pas si vous avez une proposition à me faire pour l'impression de Jtable et si peut aussi ajouter quelques informations de JtextFild dans la même page. Concernant le Jide j'ai télécharge les différents jar puis utilisé votre exemple pour essayer mais j'ai quelques erreur que je n'arrive pas à corriger. voici le code de l'exemple
    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
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.util.Arrays;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.NoSuchElementException;
    import java.util.Objects;
    import java.util.OptionalDouble;
    import java.util.concurrent.ThreadLocalRandom;
    import java.util.function.Function;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    import java.util.stream.StreamSupport;
     
    import javax.swing.BorderFactory;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTable;
    import javax.swing.event.TableModelEvent;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.AbstractTableModel;
    import javax.swing.table.DefaultTableModel;
     
    import com.jidesoft.swing.JideScrollPane;
     
    public class JTableWithFooterExemple {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Exemple");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		String[] cols = {"Col1","Col2","Col3"};
     
    		Object[][] datas = new Object[30][cols.length];
     
    		for(int i=0; i<datas.length; i++) {
    			datas[i][0]=i%2==0?"toto":null;
    			for(int j=1; j<datas[i].length; j++) {
    				datas[i][j]=ThreadLocalRandom.current().nextDouble(-100,100);
    			}
    		}
     
     
    		DefaultTableModel model = new DefaultTableModel(datas, cols) {
    			public java.lang.Class<?> getColumnClass(int columnIndex) {
    				switch(columnIndex) {
    				case 0:
    					return String.class;
    				default:
    					return Double.class;
    				}
    			}
    		};
    		JTable table = new JTable(model);
    		table.setFillsViewportHeight(true);
     
    		JideScrollPane scrollPane = new JideScrollPane(table);
    		scrollPane.setColumnHeaderView(table.getTableHeader());
     
    		JTable footer = new JTable(new FooterTableModel(model, 
    				new FooterTableModel.ColumnFooter<String, Long>(0, String.class, s-> s.filter(Objects::nonNull).filter(x->!x.isEmpty()).count()),
    				new FooterTableModel.ColumnFooter<Double, Double>(1, Double.class, s-> s.mapToDouble(d->d.doubleValue()).sum()),
    				new FooterTableModel.ColumnFooter<Double, Double>(2, Double.class, s-> {
    					OptionalDouble od = s.mapToDouble(d->d.doubleValue()).average(); 
    					if ( od.isPresent() ) {
    						return od.getAsDouble();
    					}
    					return null;
    				})
    				)); 
    		footer.setFillsViewportHeight(false);
    		footer.setRowSelectionAllowed(false);
    		footer.setColumnSelectionAllowed(false);
    		footer.setBorder(BorderFactory.createEmptyBorder(3,0,0,0));
    		JPanel panelFooter = new JPanel(new BorderLayout());
    		panelFooter.setBorder(BorderFactory.createMatteBorder(3, 0, 0, 0, Color.RED));
    		panelFooter.add(footer);
    		scrollPane.setColumnFooterView(panelFooter);
    		footer.setColumnModel(table.getColumnModel());
     
    		frame.add(scrollPane);
     
     
    		frame.setSize(640, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true); 
     
    	}
     
    	public static class FooterTableModel extends AbstractTableModel implements TableModelListener {
     
    		final private AbstractTableModel tableModel;
    		final private Map<Integer, ColumnFooter<?,?>> columnFooters;
    		private Object[] data;
     
    		public FooterTableModel(AbstractTableModel tableModel, ColumnFooter<?,?>...footers) {
    			this.tableModel=tableModel;
    			this.columnFooters=Arrays.stream(footers).collect(Collectors.toMap(ColumnFooter::getColumnIndex, Function.identity()));
    			init();
    			tableModel.addTableModelListener(this);
    		}
     
    		private void init() {
    			data = new Object[tableModel.getRowCount()];
    			updateAllColumns();
    		}
     
    		private void updateAllColumns() {
    			columnFooters.values().forEach(this::updateColumn);
    		}
     
    		@SuppressWarnings({ "rawtypes", "unchecked" })
    		private void updateColumn(ColumnFooter footer) {
    			columnAsStream(footer.getColumnIndex()).forEach(System.out::println);
    			setValueAt(footer.compute(columnAsStream(footer.getColumnIndex()).map(footer::cast)), 0, footer.getColumnIndex());
    		}
     
    		public void updateColumn(int columnIndex) {
    			ColumnFooter<?, ?> footer = columnFooters.get(columnIndex);
    			if ( footer==null ) {
    				setValueAt(null, 0, columnIndex);
    			}
    			else {
    				updateColumn(footer);
    			}
    		}
     
    		private Stream<?> columnAsStream(final int columnIndex) {
    			Iterable<?> iter = new Iterable<Object>() {
    				@Override
    				public Iterator<Object> iterator() {
    					return new Iterator<Object>() {
     
    						private int rowIndex=0;
    						@Override
    						public boolean hasNext() {
    							return rowIndex<tableModel.getRowCount();
    						}
     
    						@Override
    						public Object next() {
    							if ( hasNext() ) {
    								return tableModel.getValueAt(rowIndex++, columnIndex);
    							}
    							throw new NoSuchElementException();
    						}
     
    					};
    				}
    			};
    			return StreamSupport.stream(iter.spliterator(), false);
    		}
     
    		@Override
    		public int getColumnCount() {
    			return tableModel.getColumnCount();
    		}
     
    		@Override
    		public int getRowCount() {
    			return 1;
    		}
     
    		@Override
    		public Object getValueAt(int rowIndex, int columnIndex) {
    			if ( rowIndex!=0 ) {
    				throw new IndexOutOfBoundsException();
    			}
    			return data[columnIndex];
    		}
     
    		@Override
    		public void setValueAt(Object value, int rowIndex, int columnIndex) {
    			if ( rowIndex!=0 ) {
    				throw new IndexOutOfBoundsException();
    			} 
    			data[columnIndex]=value;
    			fireTableCellUpdated(rowIndex, columnIndex);
    		}
     
    		@Override
    		public void tableChanged(TableModelEvent event) {
    			switch (event.getType()) {
    			case TableModelEvent.ALL_COLUMNS:
    				init();
    				break;
    			case TableModelEvent.INSERT:
    				updateAllColumns();
    				break;
    			case TableModelEvent.UPDATE:
    				int columnIndex = event.getColumn();
    				updateColumn(columnIndex);
    			default:
    				break;
    			}
    		}
     
    		public static class ColumnFooter<T, R> {
     
    			private final Class<T> c;
    			private final Function<Stream<T>, R> function;
    			private final int columnIndex;
     
    			public ColumnFooter(int columnIndex, Class<T> c, Function<Stream<T>,R> function) {
    				this.columnIndex=columnIndex;
    				this.c=Objects.requireNonNull(c);
    				this.function=Objects.requireNonNull(function);
    			}
     
    			public R compute(Stream<T> values) {
    				return function.apply(values);
    			}
     
    			public int getColumnIndex() {
    				return columnIndex;
    			}
     
    			public T cast(Object value) {
    				return c.cast(value);
    			}
     
    		}
     
    	}
    Actuellement j'ai des erreurs dans cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    JTable footer = new JTable(new FooterTableModel(model, 
    				new FooterTableModel.ColumnFooter<String, Long>(0, String.class,s-> s.filter(Objects::nonNull).filter(x->!x.isEmpty()).count()),
    				new FooterTableModel.ColumnFooter<Double, Double>(1, Double.class, s-> s.mapToDouble(d->d.doubleValue()).sum()),
    				new FooterTableModel.ColumnFooter<Double, Double>(2, Double.class, s-> {
    					OptionalDouble od = s.mapToDouble(d->d.doubleValue()).average(); 
    					if ( od.isPresent() ) {
    						return od.getAsDouble();
    					}
    					return null;
    				})
    				));
    particulièrement au niveau des 's',
    celle là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public FooterTableModel(AbstractTableModel tableModel, ColumnFooter<?,?>...footers) {
    			this.tableModel=tableModel;
    			this.columnFooters=Arrays.stream(footers).collect(Collectors.toMap(ColumnFooter::getColumnIndex, Function.identity()));
    			init();
    			tableModel.addTableModelListener(this);
    		}
    ,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    private void updateAllColumns() {
    			columnFooters.values().forEach(this::updateColumn);
    		}
     
    		@SuppressWarnings({ "rawtypes", "unchecked" })
    		private void updateColumn(ColumnFooter footer) {
    			columnAsStream(footer.getColumnIndex()).forEach(System.out::println);
    			setValueAt(footer.compute(columnAsStream(footer.getColumnIndex()).map(footer::cast)), 0, footer.getColumnIndex());
    		}
    Voici les jar que j'ai téléchargé et ajouté dans la class path de mon projet sont : jide-oss-3.6.18, junit-4.10 et ui.

  15. #15
    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 : 56
    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
    Pour les erreurs, ce serait mieux de savoir quelles erreurs (type (compilation/exécution), messages/stacktrace). D'ailleurs, c'est valable aussi pour ton problème JasperReport. Pour le problème avec la JTable avec footer, je soupçonne que tu n'es pas en Java 8.

    Pour l'impression, ça dépend. Tu cherches à imprimer comment, quoi, dans quel but ? Pour une simple impression, pour avoir un vision papier/pdf de la JTable, un simple impression native Java peut suffire. Regarde ici par exemple.
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Je veux imprimé les informations d'un client (Nom, Prenom, Contact, ....) dans un cadre en haut de la page. Puis les opérations que ce client a effectuée dans la caisse au cours d'une période donnée dans un Jtable. Les informations et les opérations toutes dans une page (bien sure il peut avoir la suit dans une autre page). Voilà ce que je souhaite faire dans l'impression.

  17. #17
    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 : 56
    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
    Tout ça peut être fait par le système d'impression natif, ou à l'aide d'une bibliothèque de génération de PDF (impression indirecte pour économiser le papier). JasperReport simplifie ça, mais on peut tout faire soi-même (c'est plus long et fastidieux, c'est sûr).
    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.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Je vais donc travail sur le lien que vous n'avez envoyé dans le message précédant concernant l'impression. En ce qui concerne également les erreurs je vais les cherchés à tête reposé. Pour le Java que j'utilise il s'agit de : jdk1.8.0_77.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Bonsoir,
    j'ai finalement trouvé une solution. Lorsque je remplie toutes les cases vides de la dernière ligne par des éléments (espace simple ou n'importe quelle écriture) l'impression marche bien. Merci.

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

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

    Informations forums :
    Inscription : Décembre 2016
    Messages : 114
    Par défaut
    Bonjour,
    par rapport au lien que Joel.drigo m'a envoyé pour l'impression du Jtable, j'ai essayé et sa marche bien avec le code ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void imprimerPortrait(){
    		MessageFormat header= new MessageFormat("Raport d'imprsession");
    		MessageFormat footer= new MessageFormat("Page{0,number,integer}");
    		try {
    			table.print(JTable.PrintMode.FIT_WIDTH, header, footer);
    		} catch (java.awt.print.PrinterException e) {
    			// TODO: handle exception
    			System.err.format("le document ne peut pas être imprimé", e.getMessage());
    		}
     
    	}
    A présent je souhait pouvoir mettre sur la même page l'information sur le client (Nom, prénom, adresse, ...) en haut de la page qui contient le Jtable.
    Je ne sait pas comment faire cela. Veuillez m'aider s'il vous plais.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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, 12h47
  2. Calcul d'un ratio dans la colonne total
    Par datametric dans le forum Cognos
    Réponses: 3
    Dernier message: 18/03/2010, 11h12
  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, 15h30
  4. Réponses: 1
    Dernier message: 11/04/2006, 16h41
  5. [rave report] Calculer un total
    Par webbulls dans le forum Rave
    Réponses: 2
    Dernier message: 24/05/2004, 17h53

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