Partage
  • Partager sur Facebook
  • Partager sur Twitter

Jtable

Avec arraylist dynamique

    28 mai 2009 à 11:57:36

    bonjour :D

    Je suis entrain d'essayer de me servir d'une jtable et j'en appelle à votre aide :D

    Je crée donc mon tableau de cette façon:
    data = new Object[Save.tabreferenceN.size()][4] ;
    for( int z=0; z< Save.tabreferenceN.size() ; z++)
    						{System.out.println("eee"+Save.tabreferenceN.get(z).getNum_bon());
    							data[z][0]=Save.tabreferenceN.get(z).getNum_bon();
    							data[z][1]=Save.tabreferenceN.get(z).getFormat_blister();
    							data[z][2]=Save.tabreferenceN.get(z).getNb_coque();
    							data[z][3]=Save.tabreferenceN.get(z).getEmplacement();
    						}
    
    String[] title = {"Reference",
    		                        "Format Blister",
    		                        "Nombre de coque",
    		                        "Emplacement"};
    						
    
    tableau = new JTable(new DefaultTableModel(data, title));
    this.add(new JScrollPane(tableau));
    


    Mon panneau s'ajoute à un jpanel, et est parfaitement afficher.

    Le problème est que mon arraylist change (ajout, modification et suppression de donnée) et j'aimerai donc modifier mon tableau dès que mon arraylist change.

    J'ai tenté de faire celà:
    public void entrepot()
    	{
    		Object[][] data2 = new Object[Save.tabreferenceN.size()][4] ;
    		for( int z=0; z< Save.tabreferenceN.size() ; z++)
    		{System.out.println("eee"+Save.tabreferenceN.get(z).getNum_bon());
    			data2[z][0]=Save.tabreferenceN.get(z).getNum_bon();
    			data2[z][1]=Save.tabreferenceN.get(z).getFormat_blister();
    			data2[z][2]=Save.tabreferenceN.get(z).getNb_coque();
    			data2[z][3]=Save.tabreferenceN.get(z).getEmplacement();
    		}
    	
    		((AbstractTableModel) tableau.getModel()).fireTableDataChanged();
    
    		
    	}
    


    Le problème est que sa ne change rien du tout a mon panneau :euh:

    Je vais être obligé de passer par un modèle? sachant que ce sont juste les donnée qui sont modifiées.

    Si vous pensez qu'il me faut obligatoirement un modèle, vous pourriez me donner une base? car je n'ai pas vraiment compris ou je devais mettre mon arraylist dans le modèle XD

    Merci pour votre futur aide :)
    • Partager sur Facebook
    • Partager sur Twitter
      28 mai 2009 à 12:54:07

      Je vois une erreur, mais je ne garantis pas que la corriger règlera ton problème. Ceci dit, y'a des chances que ça t'approche du but, et ça ne t'en éloignera pas, toujours :p

      Citation : bkhenaton

      Object[][] data2 = new Object[Save.tabreferenceN.size()][4] ;
      


      Ici, tu crées un *nouveau* tableau, qui n'a rien à voir avec le précédent (Si ce n'est son nom de variable). De plus, à aucun moment tu n'appliques ce tableau à ta JTable. Du coup, ton tableau et ta JTable n'ont aucun lien : aucune chance pour qu'elle puisse connaître ses valeurs, ou savoir qu'il est modifié.

      Tu as donc 2 options :

      - Soit tu récupères le tableau que tu as initialement passé à ta JTable, et tu en modifies les valeurs
      - Soit tu restes sur la création d'un nouveau tableau, et tu le repasses à ta JTable

      Le problème étant que je ne connais pas la JTable, et qu'après un (très) bref coup d'oeil à la JavaDoc, je n'ai rien vu permettant de faire l'un ou l'autre (Une méthode setData ou getData aurait pu être utile). Du coup, soit tu mémorises ton tableau initial (data2) quelque part, pour pouvoir y accéder quand tu as besoin de faire une modification, soit tu fouilles la doc un peu mieux que moi pour trouver comment récupérer le tableau courant de ta JTable, ou comment en ajouter un nouveau.

      Je pense que mémoriser data2 et le modifier par la suite (Au lieu de créer un nouveau data2) sera le plus simple. (Le reste du code ne devrait pas changer).

      Accessoirement, je suis pas convaincu par ton fireTableDataChange. Il me semble que cette méthode est destinée à informer les "eventListeners" de la JTable que les données ont été modifiées. Je doute qu'elle mette à jour l'interface (Cherche plutôt du côté des méthodes update ou updateUI (Fait longtemps que j'ai pas fait de Swing ^^ ))
      • Partager sur Facebook
      • Partager sur Twitter
        28 mai 2009 à 13:16:42

        Pourtant chez moi firDataChanged marche, ça permet de remettre toute la table à jour, l'affichage, le modèle et le cellEditeur aussi je crois, mais il faut bien entendu que tu crée une méthode qui modifie le tableau de données de ton modèle.
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2009 à 13:42:22

          Merci vous 2 :)

          Veldryn, c'est vrai que mon data2 ne servait à rien après relecture :lol:

          Je l'ai donc remplacé comme ceci:
          public void entrepot ()
          	{
          		data = new Object[Save.tabreferenceN.size()][4] ;
          		for( int z=0; z< Save.tabreferenceN.size() ; z++)
          		{System.out.println("eee"+Save.tabreferenceN.get(z).getNum_bon());
          			data[z][0]=Save.tabreferenceN.get(z).getNum_bon();
          			data[z][1]=Save.tabreferenceN.get(z).getFormat_blister();
          			data[z][2]=Save.tabreferenceN.get(z).getNb_coque();
          			data[z][3]=Save.tabreferenceN.get(z).getEmplacement();
          		}
          	
          		((AbstractTableModel) tableau.getModel()).fireTableDataChanged();
          		System.out.println(""+data[(Save.tabreferenceN.size())-1][3]);
          		
          	}
          


          J'ai pu vérifier grâce au system.out que mon data se mettait bien à jour :)

          Il ne me reste plus qu'à mettre à jour l'affichage de mon Jtable :)

          Lolilolight si tu pouvais m'en dire un peu plus sur cette méthode?
          • Partager sur Facebook
          • Partager sur Twitter
            28 mai 2009 à 13:59:23

            Hmmm... t'as pas bien compris ce que je disais (D'un autre côté, je viens de voir que j'ai pas été très clair sur un détail).

            Le problème n'est pas dans le nom de la variable (data, data2, trucbidule, on s'en fout), mais dans le fait que tu crées un nouvel objet ("new"), au lieu d'utiliser l'objet existant.

            Si tout est dans la même classe, la solution la plus simple est de passer par une variable d'instance. A la création de la JTable, tu fais :

            this.data = new Object[...][...];
            ...
            tableau = new JTable(data, ...);
            


            Et à la modification, tu reprends le même data :

            this.data[x][y] = ...; //Là, tu modifies l'existant
            


            (A noter que le "this" est facultatif dans la notation, l'important c'est que data soit déclaré comme un attribut de la classe dans laquelle tu te trouves... En considérant que tout ça se fait dans une seule et même classe).
            • Partager sur Facebook
            • Partager sur Twitter
              28 mai 2009 à 13:59:41

              fireDataChanged ()?
              Elle avertis le modèle que des données ont changer et si j'ai bien lu java réappelle le constructeur de defaultTableModel, il réapelle aussi normalement les méthodes pour la mise à jour de l'affichage, et celle qui définis si les cellules sont éditables.

              J'appelle souvent cette méthode dans un actionPerformed d'un bouton dans ma JTable.
              • Partager sur Facebook
              • Partager sur Twitter
                28 mai 2009 à 14:19:20

                Veldryn, oki mais la première fois je déclare "data = new Object[Save.tabreferenceN.size()][4] ;" c'est à dire avec une taille fixe. Or après dans la fonction entrepot j'aimerai que Object "grandisse", donc redéfinir sa taille ^^
                Mais comment ?
                Je me sens incompétent là :honte:

                Lolilolight depuis tout à l'heure je suis sur ton post :
                http://www.siteduzero.com/forum-83-389 [...] e-jtable.html
                Et j'avoue ne pas trop savoir pourquoi mon fireDataChanged ne marche pas :(
                • Partager sur Facebook
                • Partager sur Twitter
                  28 mai 2009 à 14:26:49

                  Il y'a un constructeur de JTable qui prend des Vector (structure dynamique)... Même si ceux-ci devraient avoir disparu on a encore besoin parfois.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mai 2009 à 15:50:03

                    Ha si tu veux rajouter des données dans la table par la suite oui il vaut mieux utiliser Vector.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Jtable

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown