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 :

probleme jtable dynamique


Sujet :

Composants Java

  1. #1
    Membre du Club Avatar de bzakaria
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 57
    Points
    57
    Par défaut probleme jtable dynamique
    salut
    je voudrais savoir comment remplir un jtable par vector dynamique .
    j'ai essaye mais il s'affiche sur le jtable que les premières enregistrement saisissent .
    voila mon code

    vecteur dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public static Vector<Object> f = new Vector<Object>();
     
        public Vector<Object> addobj(String forme,double longueur,double largeur,double hauteur,double surface){
     
     
            f.add(forme);
            f.add(longueur);
            f.add(largeur);
            f.add(hauteur);
            f.add(surface);
    return f;
        }
    methode d remplissage jtable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public Vector<Object> table1(){
            Vector<Object> v1 = new Vector<Object>();
     
     
     
         v1.add(f);
     
     
     
            return v1;
        }
    methode nom colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     public Vector<String> nomcolonnes(){
        Vector<String> nomcolonnes = new Vector<String>();
            nomcolonnes.add("forme Geo.");
            nomcolonnes.add("longueur");
            nomcolonnes.add("largeur");
            nomcolonnes.add("hauteur");
            nomcolonnes.add("surface");
            return nomcolonnes;
    }

    pour afficher les éléments sur jtable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    controleur con = new controleur();
     
    double surface=555;
           con.addobj(jComboBox1.getSelectedItem().toString(),Double.parseDouble(jTextField1.getText()),Double.parseDouble(jTextField2.getText()),Double.parseDouble(jTextField3.getText()),surface);
     
     
    jTable1.setModel(new javax.swing.table.DefaultTableModel(con.table1(),con.nomcolonnes()));
     
     
        }
    le programme sous forme des zones de texte et user les rempli après quand il clique sur une bouton il ajout les infos saisi dans le jtable .

    et merci d'avance

  2. #2
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Essaie ceci:
    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
    ...
        private final Controleur con;
        private final Vector<Object> data;
        private final Vector<String> cols;
        private final DefaultTableModel model;
    ...
    //dans le constructeur:
            con = new Controleur();
            data = con.table1();
            cols = con.nomcolonnes();
            model = new DefaultTableModel(data, cols);
            jTable1.setModel(model);
    ...
        private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
            double surface = 555;
            Vector<Object> rowData = con.addobj(jComboBox1.getSelectedItem().toString(),
                    Double.parseDouble(jTextField1.getText()),
                    Double.parseDouble(jTextField2.getText()),
                    Double.parseDouble(jTextField3.getText()),
                    surface);
            data.add(rowData);
            model.setDataVector(data, cols);
        }
    ...
    class Controleur {
    ...
        public Vector<Object> addobj(String forme, double longueur, double largeur, double hauteur, double surface) {
            f = new Vector<Object>();//<----------------------------IMPORTANT !!
            f.add(forme);
            f.add(longueur);
            f.add(largeur);
            f.add(hauteur);
            f.add(surface);
            return f;
        }
    }

  3. #3
    Membre du Club Avatar de bzakaria
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    j'ai essayé... mais même problème . il affiche que les premières enregistrements.
    pour " f = new Vector<Object>();"
    c'est déjà déclarer dans la classe controleur.

  4. #4
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par bzakaria Voir le message
    pour " f = new Vector<Object>();"
    c'est déjà déclarer dans la classe controleur.
    Mais pas à la bonne place.

  5. #5
    Membre du Club Avatar de bzakaria
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    non il est à la bonne place. même classe où se trouve methode de remplisssage vecteur f.
    je pense que le problème vient de cette methode

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     public Vector<Object> table1(){
            Vector<Object> v1 = new Vector<Object>();
     
     
     
         v1.add(f);
     
     
     
            return v1;
        }

  6. #6
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par bzakaria Voir le message
    ... il est à la ... même classe où se trouve méthode de remplissage vecteur f.
    Je crois qu'on se comprend mal. Le vecteur "f" représente les données d'une ligne: il faut donc créer un nouvel objet pour chaque ligne. Tu dois déplacer/copier la création vers la méthode de remplissage "addobj", comme je l'ai proposé plus haut.
    La méthode "table1" est appelé seulement une fois dans le constructeur de la classe principale. Elle ajoute une seule ligne blanche au début de la table. Donc elle n'a pas d'influence sur les lignes suivantes.
    Pour mieux comprendre ce que je veux dire, tu peux comparer avec l'exemple suivant. Remarque que les noms des classes doivent commencer de préférence par une lettre majuscule: controleur -> Controleur.
    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
    /*
     * TableDemo.java
     *
     */
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.*;
    public class TableDemo extends JFrame {
        private JButton btAdd;
        private JComboBox combo;
        private JPanel controls;
        private JTable table;
        private JTextField tf1;
        private JTextField tf2;
        private JTextField tf3;
        private final Controleur con;
        private final Vector<Object> data;
        private final Vector<String> cols;
        private final DefaultTableModel model;
        public TableDemo() {
            super("TableDemo");
            initComponents();
            con = new Controleur();
            data = con.table1();
            cols = con.nomcolonnes();
            model = new DefaultTableModel(data, cols);
            table.setModel(model);
        }
        private void initComponents() {
            table = new JTable();
            controls = new JPanel();
            combo = new JComboBox();
            tf1 = new JTextField(10);
            tf2 = new JTextField(10);
            tf3 = new JTextField(10);
            btAdd = new JButton("Add");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
            combo.setModel(new DefaultComboBoxModel(new String[]{"Item 1", "Item 2", "Item 3", "Item 4"}));
            controls.add(combo);
            tf1.setText("1.1");
            controls.add(tf1);
            tf2.setText("1.2");
            controls.add(tf2);
            tf3.setText("1.3");
            controls.add(tf3);
            btAdd.setFocusable(false);
            btAdd.setHorizontalTextPosition(SwingConstants.CENTER);
            btAdd.setVerticalTextPosition(SwingConstants.BOTTOM);
            btAdd.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent evt) {
                    jButton2ActionPerformed(evt);
                }
            });
            controls.add(btAdd);
            getContentPane().add(controls, BorderLayout.PAGE_END);
            setSize(600, 300);
            setLocationRelativeTo(null);
        }
        private void jButton2ActionPerformed(ActionEvent evt) {
            double surface = 555;
            Vector<Object> rowData = con.addobj(combo.getSelectedItem().toString(),
                    Double.parseDouble(tf1.getText()),
                    Double.parseDouble(tf2.getText()),
                    Double.parseDouble(tf3.getText()),
                    surface);
            data.add(rowData);
            model.setDataVector(data, cols);
        }
        public static void main(final String[] args) {
            Runnable gui = new Runnable() {
                public void run() {
                    new TableDemo().setVisible(true);
                }
            };
            //GUI must start on EventDispatchThread:
            SwingUtilities.invokeLater(gui);
        }
    }
    class Controleur {
        public static Vector<Object> f;
        public Vector<String> nomcolonnes() {
            Vector<String> nomcolonnes = new Vector<String>();
            nomcolonnes.add("forme Geo.");
            nomcolonnes.add("longueur");
            nomcolonnes.add("largeur");
            nomcolonnes.add("hauteur");
            nomcolonnes.add("surface");
            return nomcolonnes;
        }
        public Vector<Object> table1() {
            Vector<Object> v1 = new Vector<Object>();
            v1.add(f);
            return v1;
        }
        public Vector<Object> addobj(String forme, double longueur, double largeur, double hauteur, double surface) {
            f = new Vector<Object>();
            f.add(forme);
            f.add(longueur);
            f.add(largeur);
            f.add(hauteur);
            f.add(surface);
            return f;
        }
    }

  7. #7
    Membre du Club Avatar de bzakaria
    Développeur informatique
    Inscrit en
    Octobre 2007
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    merci mon frère.
    ça marche maintenant .

  8. #8
    Membre actif Avatar de uhrand
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2009
    Messages
    203
    Détails du profil
    Informations personnelles :
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 203
    Points : 275
    Points
    275
    Par défaut
    Citation Envoyé par bzakaria Voir le message
    ça marche maintenant.
    Si tu veux aller plus loin, tu peux structurer ton application suivant la structure MVC (Model View Controller) afin d'avoir une meilleur séparation entre les données et la vue. Voici un exemple (j'ai remplacé également "setDataVector" par "addRow" qui est plus performant):
    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
    /**
     * Model
     */
    import java.util.*;
    import javax.swing.table.DefaultTableModel;
     
    public class GeoModel extends Observable {
     
        private final Vector<String> cols;
        private final Vector<Object> data;
        private DefaultTableModel model;
        private Vector<Object> rowData;
     
        public GeoModel() {
            data = table1();
            cols = nomcolonnes();
        }
     
        public void init() {
            model = new DefaultTableModel(data, cols);
            //informer la vue que le modèle a changé:
            setChanged();
            notifyObservers(model);
        }
     
        public void addobj(String forme, double longueur, double largeur, double hauteur) {
            double surface = 555;
            rowData = new Vector<Object>();
            rowData.add(forme);
            rowData.add(longueur);
            rowData.add(largeur);
            rowData.add(hauteur);
            rowData.add(surface);
    //        data.add(rowData);
    //        model.setDataVector(data, cols);
            model.addRow(rowData); //addRow est plus performant que setDataVector
            //ici nous n'avons pas besoin d'informer la vue
            //parceque "addRow" le fait pour nous
        }
     
        private Vector<String> nomcolonnes() {
            Vector<String> nomcolonnes = new Vector<String>();
            nomcolonnes.add("forme Geo.");
            nomcolonnes.add("longueur");
            nomcolonnes.add("largeur");
            nomcolonnes.add("hauteur");
            nomcolonnes.add("surface");
            return nomcolonnes;
        }
     
        private Vector<Object> table1() {
            Vector<Object> v1 = new Vector<Object>();
            v1.add(rowData);
            return v1;
        }
    }
    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
    /**
     * View
     */
    import java.awt.*;
    import java.awt.event.*;
    import java.util.*;
    import javax.swing.*;
    import javax.swing.table.TableModel;
     
    public class GeoViewer extends JFrame implements Observer {
     
        private GeoController controller;
        private JButton btAdd;
        private JComboBox combo;
        private JPanel controls;
        private JTable table;
        private JTextField tfLenght, tfWidth, tfHeight;
     
        public GeoViewer(final GeoController controller) {
            super("GeoViewer");
            this.controller = controller;
            controller.init();
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            init();
            pack();
            setLocationRelativeTo(null);
            setVisible(true);
        }
     
        private void init() {
            table = new JTable();
            controls = new JPanel();
            combo = new JComboBox();
            tfLenght = new JTextField(10);
            tfWidth = new JTextField(10);
            tfHeight = new JTextField(10);
            btAdd = new JButton("Add");
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
            combo.setModel(new DefaultComboBoxModel(new String[]{"Item 1", "Item 2",
                        "Item 3", "Item 4"}));
            controls.add(combo);
            tfLenght.setText("1.1");
            controls.add(tfLenght);
            tfWidth.setText("1.2");
            controls.add(tfWidth);
            tfHeight.setText("1.3");
            controls.add(tfHeight);
            btAdd.setFocusable(false);
            btAdd.setHorizontalTextPosition(SwingConstants.CENTER);
            btAdd.setVerticalTextPosition(SwingConstants.BOTTOM);
            btAdd.addActionListener(new ActionListener() {
     
                public void actionPerformed(ActionEvent evt) {
                    controller.addobj(combo.getSelectedItem().toString(),
                            Double.parseDouble(tfLenght.getText()),
                            Double.parseDouble(tfWidth.getText()),
                            Double.parseDouble(tfHeight.getText()));
                }
            });
            controls.add(btAdd);
            getContentPane().add(controls, BorderLayout.PAGE_END);
            setSize(600, 300);
            setLocationRelativeTo(null);
        }
     
        // see java.util.Observer#update(java.util.Observable, java.lang.Object)
        public void update(Observable observable, Object arg) {
            table.setModel((TableModel) arg);
        }
    }
    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
    /**
     * Controller
     */
    import javax.swing.*;
     
    public class GeoController {
     
        private GeoModel geoModel;
     
        public GeoController() {
            geoModel = new GeoModel();
            GeoViewer viewer = new GeoViewer(this);
            geoModel.addObserver(viewer);
        }
     
        public void addobj(String forme, double longueur, double largeur, double hauteur) {
            geoModel.addobj(forme, longueur, largeur, hauteur);
        }
     
        public void init() {
            Runnable init = new Runnable() {
     
                public void run() {
                    geoModel.init();
                }
            };
            //Be sure the view has been registered with the model:
            SwingUtilities.invokeLater(init);
        }
     
        public static void main(final String[] args) {
            Runnable gui = new Runnable() {
     
                @Override
                public void run() {
                    new GeoController();
                }
            };
            //GUI must start on EventDispatchThread:
            SwingUtilities.invokeLater(gui);
        }
    }

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

Discussions similaires

  1. [NetBeans] Probleme Jtable avec Netbeans
    Par mathis49 dans le forum NetBeans
    Réponses: 3
    Dernier message: 05/02/2006, 18h04
  2. Probleme JTable Header et largeur colonnes
    Par Seth77 dans le forum Composants
    Réponses: 6
    Dernier message: 16/01/2006, 10h36
  3. [struts] probleme champs dynamiques
    Par rocco dans le forum Struts 1
    Réponses: 28
    Dernier message: 07/06/2004, 21h26
  4. [LG]Problême Variable dynamique de types différents
    Par pierrOPSG dans le forum Langage
    Réponses: 2
    Dernier message: 29/04/2004, 16h01

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