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 :

Problème d'ajout de ligne dans une JFrame


Sujet :

Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 6
    Points
    6
    Par défaut Problème d'ajout de ligne dans une JFrame
    Bonjour,

    Je souahites ajouter des lignes dans un tableau au fur et à mesure que je parcours le ResultSet de mon ordre sql.

    J'ai lu que pour se faire je doit utiliser la méthode addRow(Object[] rowData) qui se trouve dans la classe DefaultTableModel.
    Or, j'utilise un model qui hérite de AbstractTableModel.
    Comme faire pour que mon modèle hérite également des méthodes de la classe DefaultTableModel ?
    Peut-être que je fais complètement fausse route ?

    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
    import java.awt.*;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.*;
     
     
     
    public class Principale {
     
    	static int row1, col1;
     
    	public static void main(String[] args) {
     
    		row1 = 0;
    		col1 = 0;
     
    		Frame fenetre = new Frame("Cave à vins");
    		Label label_titre = new Label("Cave à vins", 550, 0, 200, 50);
     
    		try {
     
     
    			Object[][] donnees = {{"",""}};
    			String[] entetes = {"Prénom", "Nom"};
     
    			ModeleTableau mm = new ModeleTableau(donnees, entetes);
     
    			JTable tableau = new JTable(mm);
     
    			JScrollPane scrollPane = new JScrollPane(tableau);
    			scrollPane.setColumnHeaderView(tableau.getTableHeader());
     
    			scrollPane.setBounds(150, 150, 600, 500);
    			fenetre.add(scrollPane);
    			fenetre.add(label_titre);
     
     
    			tableau.setBounds(150, 150, 600, 200);
     
     
    			fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    			Connexion con = new Connexion();
    			Statement stat = con.GetConnexion().createStatement();
     
    			ResultSet resultat = stat.executeQuery("SELECT * FROM REGION");
     
    			while(resultat.next())
    	  		{
    				System.out.print(resultat.getString("ID_REGION"));
    				System.out.print(" => ");
    	  			System.out.println(resultat.getString("NOM_REGION"));
     
    	  			mm.setValueAt(resultat.getString("ID_REGION"), row1, col1);
    	  			col1 = col1 + 1;
    	  			mm.setValueAt(resultat.getString("NOM_REGION"), row1, col1);
    	  			row1 = row1 + 1;
    	  			col1 = 0;
     
    	  			//scrollPane.setViewportView(tableau);
     
    			}	
    		}
    		catch (SQLException e){
    			e.printStackTrace();
    		}
     
    	}
     
    }
    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
    import javax.swing.table.AbstractTableModel;
     
     
    public class ModeleTableau 
    	  extends AbstractTableModel{ 
     
       Object donnees[][];
       String titres[];
     
       public ModeleTableau(
          Object donnees[][], String titres[]){ 
          this.donnees = donnees; 
          this.titres = titres; 
       } 
     
       public int getColumnCount(){ 
    	      return donnees[0].length; 
    	   }
     
    	   public Object getValueAt(int parm1, int parm2){ 
    	      return donnees[parm1][parm2]; 
    	   }
     
    	   public int getRowCount() { 
    	      return donnees.length; 
    	   }
     
    	   public String getColumnName(int col){ 
    	      return titres[col]; 
    	   } 
     
    	   public void setValueAt(Object value, int row, int col) {
    			donnees[row][col] = value;
    			fireTableCellUpdated(row,col);
    		}
    }

  2. #2
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Tout d'abord il fallait donner le bon titre c'était pour l'ajout de ligne dans un un JTable et non pas dans un JFrame.

    Ok, J'ai examiné ton code j'ai constaté que tu n'a pas defini les méthodes d'ajout et d'insertion dans ton ModelTableau. Il faut savoir que la méthode setValueAt suppose que la ligne existe et que tu veut modifier et non pas inserer.

    Pour inserer il faut toujour inserer une ligne et soit on l'insere plein ou avec des valeurs par defaut comme "" pour les string et après on appel la méthode setValueAt. J'ai rectifié le code de tes deux classes.

    Deusième chose il fallait savoir qu'avec un tabelau de 2 dimention pour les donnés tu ne va pas pouvoir ajouter facillement car à chaque fois il faut detruire l'existant et reconstruive avec le nouveau,donc il te faut un vecteur tu verra comment j'ai rectifié ton code et j'ai ajouté les méthode manquants pour l'insertion,l'ajout qui est une insertion à la fin,et la justification au cas où la ligne n'est pas complète

    Pour la classe ModelTableau :

    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
    public class ModeleTableau 
       extends AbstractTableModel{ 
     
       Vector<Object[]> donnees;
       String titres[];
     
     
       public ModeleTableau(
          Vector <Object[]> donnees, String titres[]){ 
          this.donnees = donnees; 
          this.titres = titres; 
       } 
       //Le dernier constructeur à vrai dire ne sera pas utilisé que si tu as déjà des donnés à y mettre
     public ModeleTableau(int nbrLigne, String titres[]){ 
          this.donnees=new Vector<Object[]>(nbrLigne);//Juste pour le nombre initiale de ligne
          this.titres = titres; 
       } 
       public int getColumnCount(){ 
           return  titres.length;
        }
     
        public Object getValueAt(int ligne, int colone){ 
                     return donnees.get(ligne)[colone];
        }
     
        @Override
        public int getRowCount() { 
           return donnees.size();//Ce n'est pas la capacité mais le nombre d'element actuel
                  //
        }
     
        @Override
        public String getColumnName(int col){ 
           return titres[col]; 
        } 
     
        @Override
        public void setValueAt(Object value, int row, int col) {
       donnees.elementAt(row)[col]=value;
       fireTableCellUpdated(row,col);
      }
     
         public void insertRow(int ligne, Object []Donneslingne) {
            donnees.insertElementAt(Donneslingne, ligne);
            justifierligne(ligne, ligne+1);
            fireTableRowsInserted(ligne, ligne);
        }
     
        public void addRow(Object[]DonnesLigne){
            insertRow(getRowCount(),DonnesLigne);
     
        }
        //Au cas où on insert une ligne dont les champs ne sont pas justfié
        private void justifierligne(int from, int to) {
     
            donnees.setSize(getRowCount());
            for (int i = from; i < to; i++) {
                if (donnees.elementAt(i) == null) {
                    donnees.setElementAt(new Object[getColumnCount()], i);
                }else
                {  Object[]objets= new Object[getColumnCount()];
                for(int j=0;j<donnees.elementAt(i).length;j++)objets[j]=donnees.elementAt(i)[j];
                donnees.setElementAt(objets, i);
                }
            }
        }
    }
    Pour la mise à jour au moment du parcours du ResultSet il faut à chaque fois inserer une ligne qui contient les valeurs ou bien inserer une ligne qui contient des valeurs par defaut ou null et appeler la méthode setValueAt . Je n'ai pas testé ça avec une base données mais ça va marcher et s'il y a un problème tu l'amène ici:
    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
    import java.awt.*;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
     
    import javax.swing.*;
     
     
     
    public class Principale {
     
     static int row1, col1;
     
     public static void main(String[] args) {
     
      row1 = 0;
      col1 = 0;
     
      Frame fenetre = new Frame("Cave à vins");
      Label label_titre = new Label("Cave à vins", 550, 0, 200, 50);
     
      try {
     
     
              Vector<Object[]> donnees = new Vector<Object[]>();
       String[] entetes = {"Prénom", "Nom"};
     
       ModeleTableau mm = new ModeleTableau(donnees, entetes);
     
       JTable tableau = new JTable(mm);
     
       JScrollPane scrollPane = new JScrollPane(tableau);
       scrollPane.setColumnHeaderView(tableau.getTableHeader());
     
       scrollPane.setBounds(150, 150, 600, 500);
       fenetre.add(scrollPane);
       fenetre.add(label_titre);
     
     
       tableau.setBounds(150, 150, 600, 200);
     
     
       fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
       Connexion con = new Connexion();
       Statement stat = con.GetConnexion().createStatement();
     
       ResultSet resultat = stat.executeQuery("SELECT * FROM REGION");
     
       while(resultat.next())
         {
        System.out.print(resultat.getString("ID_REGION"));
        System.out.print(" => ");
          System.out.println(resultat.getString("NOM_REGION"));
            mm.addRow(new Object[2]);
          mm.setValueAt(resultat.getString("ID_REGION"), row1, col1);
          col1 = col1 + 1;
          mm.setValueAt(resultat.getString("NOM_REGION"), row1, col1);
          row1 = row1 + 1;
          col1 = 0;
     
          //scrollPane.setViewportView(tableau);
     
       } 
      }
      catch (SQLException e){
       e.printStackTrace();
      }
     
     }
     
    }

  3. #3
    Membre chevronné
    Avatar de la.lune
    Homme Profil pro
    Directeur Technique
    Inscrit en
    Décembre 2010
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Comores

    Informations professionnelles :
    Activité : Directeur Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 545
    Points : 2 084
    Points
    2 084
    Par défaut
    Tu peut t'épargner de setValueAt et aller droit au but pas de complication du code comme tu as fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Object []o=new Object[] {resultat.getString("ID_REGION"), resultat.getString("NOM_REGION") };
                                    mm.addRow(o);
    Et en fonction de nombre de clone que tu veut tu fait mais toujours en fonction de des clones existant dans ton objet. Pour faire des clones dynamique c'est faisable il faut définir les méthode.

    Pour ce qui est de DefaultModel, je n'ai jamais testé, mais je ne vois pas aussi d’inconvénient d’hériter de la classe DefaultModel mais dans ce cas on aura pas vraiment l'utilité d’implémenter notre propre model ,en tout cas rien n'empêche de l'utiliser directement sans héritage,sans définir ton propre model si tu n'a pas à personnaliser tes objet.

Discussions similaires

  1. [WD15] Problème ajouts de ligne dans une table
    Par webnaute dans le forum WinDev
    Réponses: 6
    Dernier message: 05/12/2012, 14h23
  2. Problème d'ajout de ligne dans une datagridview
    Par mustapha_ess dans le forum C++/CLI
    Réponses: 1
    Dernier message: 23/07/2010, 16h16
  3. Problèmes de dessin de ligne dans une JFrame .
    Par Pragmateek dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 24/03/2008, 16h11
  4. [web] Wxperl -> ajout de ligne dans une grid
    Par Airmoi dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 08/11/2006, 15h55
  5. Réponses: 14
    Dernier message: 22/09/2005, 16h49

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