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

Composants Java Discussion :

[JTable] Calcul automatique dans un JTable


Sujet :

Composants Java

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut [JTable] Calcul automatique dans un JTable
    Bonjour à tous,

    J'ai une petite colle un peu barbare à laquelle je n'ai pas encore trouvé de réponse :

    Soit un JTable contenant 3 colonnes (col1, col2, col3),
    il faudrait que lorsque l'on modifie la valeur sur une ligne row1 en col1, la valeur de (col3,row1) soit égale au produit de valeur(col1,row1) et valeur(col2,row1).

    Je sèche sur le type d'evenement à écouter.

    Autre difficulté, le JTable n'a pas un nombre de ligne définit car on peut via des boutons, ajouter des lignes ou en enlever au bon vouloir. Il va sans dire que le comportement décrit plus avant doit être effectif sur toute ligne créée et la suppression ne doit en rien l'affecter (ce serait trop facile sinon et je n'aurais pas posté pour si peu).

    PS : le premier qui me dit d'utiliser excel se prend une baffe, lol !!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    salut
    tu utilises bien un tableModel ?
    si oui le fait tu hériter du DefaultTableModel ?
    si oui tu charge le contenu de tes cellule via une list ?
    si oui (lol) tu peux mettre un écouteur sur cette list :
    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
     
    public class BridgeListener implements ListDataListener {
    public void intervalAdded(ListDataEvent e)
      final ListDataListener event = e;
      EventQueue.invokeLater(new Runnable() {
         public void run() {
           // Rafraichit la vue
           fireTableRowsInserted(event.getIndex0(),event.getIndex1());
        }
      });
    }
    ...
    // CE QUI VA T'INTERESSER :
    public void contentsChanged(ListDataEvent e)
      final ListDataListener event = e;
      EventQueue.invokeLater(new Runnable() {
         public void run() {
           // Rafraichit la vue
           fireTableStructureChanged();
        }
      });
     }
    }
    et ce code est insérer dans ton DefaultTableModel... si tu en utilisait un.... et ensuite ton DefaultTableModel possede une méthode getValueAt() et suivant la colonne il saura faire le traitement (multiplication...)

  3. #3
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Bonjour,

    c'est dans la TableModel que tu définie la troisième colonne comme le produit des deux autres.

    par exemple si toute des données sont des Integer :
    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
    public class MonModel extends DefaultTableModel
    {
     
        public int getColumnCount()
        {
            return 3;
        }
     
        public Object getValueAt(int row, int column)
        {
            if (column == 2) {
                int total = 0; 
                total = ((Integer)getValueAt(row,0)).intValue() * ((Integer)getValueAt(row,1)).intValue();
                return new Integer(total);
            }
            return super.getValueAt(row, column);
        }
    }

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    504
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 504
    Points : 288
    Points
    288
    Par défaut
    oui mais si il veut que ce soit effectuer automatiquement lors qu'il change une valeur de la colonne 1 ou 2, il faut qu'il pose un listenner pour mettre à jour la colonne 3 ?

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Et la réponse est ...

    le DefaultCellRenderer

    Eh oui, on y avait pas pensé mais dans celui-ci, la methode public Component getTableCellRendererComponent(*****) a pour argument la ligne ou il agit !!

    Ce qui nous donne :



    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
     
    public class CalculCellRenderer extends DefaultTableCellRenderer{
     
     
    	public void CalculCellRenderer(){
     
    	}
     
    	public Component getTableCellRendererComponent(final JTable table, Object value,boolean isSelected, boolean hasFocus,int row, int col)
    	{
     
    		setFocusable(true);
    		setEnabled(true);
    		setText(value.toString());
    		float a  = Float.valueOf(table.getValueAt(row, col2).toString());
    		int b = Integer.valueOf(value.toString());
    		float c = a * b;
    		String st_c = Float.toString(c);
    		table.setValueAt(st_c,row,col3);
     
     
            return this;
        }
    }
    Vu que le CellRenderer s'applique à la table sur une colonne donnée, toute ligne ajouté bénéficie de celui-ci. CQFD

    J'espère que le code est clair et qu'il pourra vous reservir.

    Merci à tous pour vos idées qui m'ont mis sur la voie.


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

Discussions similaires

  1. Ajout de ligne Automatique dans un jTable
    Par hazaki dans le forum Débuter
    Réponses: 2
    Dernier message: 16/04/2013, 16h15
  2. Ajout de ligne Automatique dans un jTable
    Par hazaki dans le forum Composants
    Réponses: 4
    Dernier message: 15/02/2013, 19h47
  3. Calcul automatique dans des tableaux
    Par fremsoi dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 12
    Dernier message: 01/06/2006, 17h58
  4. [JTable] PB affichage dans une JTable
    Par ythim dans le forum Composants
    Réponses: 3
    Dernier message: 19/05/2006, 17h29
  5. [JTable] Cellules multilignes dans un jtable
    Par chesteric31 dans le forum Composants
    Réponses: 15
    Dernier message: 06/06/2005, 14h50

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