Modification de cellule

Résolu
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012 - 21 mars 2012 à 22:10
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012 - 2 avril 2012 à 17:43
Bonjour,

Je suis actuellement en train de faire un programme d'upload en m'aidant de la librairie ftp4j.
Structure de mon code :

public class ElementsTab extends AbstractTableModel {
   private static final ArrayList processList = new ArrayList();
...

public Object getValueAt(int rowIndex, int columnIndex) {
        try {
        Process p = processList.get(rowIndex);
        switch(columnIndex){
            case 0: //Filename
                return p.getFileName();
            case 1: //Size
                return p.getSize();
            case 2: //barre progression
                return "0";
            case 3: //statut
                return p.getStatut();
            case 4:
                return p.getFile();
            }
        
        } catch(Exception e) {
            System.out.println(e);
        }
}


public class Process {

   File file;
  
    Process(File file) {
        this.file = file;
    }

        public File getFile() {
            return file;
        }
        
        public String getFileName() {
            return file.getName();
        }

 
         public String getStatut(){
             
               return ftp4j.FTPClient.getStatut();
          
        }

...

}


évènement sur le bouton de lancement de transfert :

public  ElementsTab e = new ElementsTab();
private void GO(java.awt.event.MouseEvent evt) { 
      for(int i=0; i<e.getRowCount();i++){
                FTPUploadFichier.main(new Process(files[i]),FtpConnexion.connexion("****"));
      }
}


public class FTPUploadFichier {

    public static void main(Process fichierU, FTPClient client) {
                
        try{
            if(client != null){
                try{
                    client.upload(fichierU.getFile(),  new FTPStatut());
                
                }catch(Exception ex){
                    System.out.println("Erreur de transfert fichier : " + ex);
                }
            }
        }
        ...

}
}


public class FTPStatut implements FTPDataTransferListener

//rien de bien important, mais nécessaire.




Ajout dans la classe FTPClient de ftp4j :

public static String getStatut(){
                return statutFichier;
 }

//statutFichier étant juste une variable chaine qui change selon le listener
//par exemple :
//if (listener !null) {listener.started();statutFichier "En cours";}


Mon problème est le suivant :

Lorsque le statut change pendant un upload, il modifie toute la colonne avec la valeur de la variable statutFichier alors qu'il faudrait que le changement se fasse seulement sur la ligne du fichier uploadé.
Lorsque ElementsTab est appelé, ne devrait-t-il pas modifier uniquement la ligne concernée ? Je ne vois vraiment pas comment faire j'ai essayé moult code, sans succès.

Accès ftp4j :

class FTPClient
librairie complète

Une aide serait la bienvenue ;)

23 réponses

cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 15:35
si j'ai bien vu, tu as fait des getter pour tes variables. (on parle ici de la class Process).
Fais aussi des setter pour celle qui pourrait être modifiée à plusieurs endroits (ou modifiée par d'autres classes.) Par exemple pour le status...
tu aurais alors une méthode:
public void setStatus(String pNewStatus)
{
   //appel à la méthode qui averti les différents listeners du changement de la variable.
   firePropertyChange(new PropertyChangeEvent(this, "status", status, pNewStatus));
   status = pNewStatus
}


le but des getters et des setters est de contrôler et gérer les accès aux variables d'instance d'une classe...
3
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 19:35
tu dois ajouter une list comme variable de class à la classe Process
tu ajoutes les listeners à cette liste
tu boucles sur cette liste pour envoyer aux listeners l'event que tu as créé (par exemple dans la methode setStatus(...)

ensuite pour gèrer cette évènement, tu t'assures que ton tableModel implémente l'interface propertyChangeListener
et principalement la méthode propertyChange(PropertyChangeEvent pEvent)
3
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
26 mars 2012 à 13:21
il est assez difficile de répondre...
mais vais quand même tenter une possibilité de début de piste...

Si toutes tes informations changent lors de la réception d'un event (gérer par un listener), je m'orienterai vers un soucis avec ce dernier...

est-ce que tu modifies bien uniquement l'élément concerné?

Je veux dire est-ce que tu as un seul listener? si non est-ce que tous reçoivent l'event?

c'est une piste.. ptet pas la bonne, mais il n'y a pas assez d'information pour vraiment voir d'où pourrait venir le problème...
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 13:58
ou alors plus simple : comment récupérer le statut et le mettre dans mon jtable (ElementsTab), car je ne sais vraiment pas comment faire. Le tuto Tapez le texte de l'url ici. me permet juste d'écrire dans la console alors que je voudrais que ça remplisse mon tableau. Ça fait 2 semaines que je suis déçu et je perds totalement espoir de trouver une solution. J'ai regardé le code de neembuuploader et la manière de procédé est un peu différente, il y a des choses que je n'ai pas vu dans mon cursus scolaire. Je suis ouvert a toutes propositions pour réglé ce problème. Si vous voulez des infos demandez moi quels codes il vous faut afin que j'enlève les différentes adresses ip, mots de passe.. merci à vous.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 14:29
pour bien faire, j'essayerais d'avoir une lien entre le listener et le process...

la première idée qui me vient est de faire en sorte que ta class Process implemente l'interface FTPDataTransfertListener...
et donc ton envoie deviendra :
client.upload(fichierU.getFile(),  fichierU);


la ton status change... apres, tu peux faire un lien entre ton Process et ton tableModel en faisant en sorte que lorsque le status change, un event est lancé et la table se met à jour...

enfin, ce n'est qu'une petite solution à moindre cout, il y a surement mieux...
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 14:46
public class Process implements ftp4j.FTPDataTransferListener {

   File file;

    Process(File file) {
        this.file = file;
    }

    Process(Object aValue) {
        this.file = (File) aValue;
    }

        public File getFile() {
            return file;
        }
        
        public String getFileName() {
            return file.getName();
        }

        public long getSize() {
            return file.length();        
        }
        
        public String getStatut(){
            return statut;
        }
        
        
//         public String getStatut(int i){
//               return ftp4j.FTPClient.getStatut(file, i);
//        }
         
//         public String getStatut(){
//             return "En attente";
//         }
//        public int getBitsTranmis(){
//            return ftp4j.FTPClient.getBitsTransmis();
//        }
         
public String getSize(long bytes) {
            if (bytes > 1048576) {
                double div = bytes / 1048576;
                return div + " MB";
            } else if (bytes > 1024) {
                double div = bytes / 1024;
                return div + " KB";
            } else {
                return bytes + " bits";
            }
        }
    
        private String statut ;
    @Override
    public void started() {
        statut = "En cours";
    }

    @Override
    public void transferred(int length) {
      
    }

    @Override
    public void completed() {
        statut = "Transféré";
    }

    @Override
    public void aborted() {
        statut = "Annulé";
    }

    @Override
    public void failed() {
        statut = "Echoué";
    }

}


Cela ne me prend pas en compte mes différents status.
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 14:52
client.upload(fichierU,  new Process(fichierU));
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:00
Que ca soit de la manière du message d'avant ou celle ci :
client.upload(fichierU.getFile(),  fichierU);
ca ne me renvoie pas le status
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 15:04
?? cela ne prends pas en compte tes différents status? Tu veux dire que ta table n'est pas mise à jour?
c'est normal, à moins de lui dire, elle ne le fera pas...
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:07
Ok mais alors je dois faire un ElementsTab.repaint() ? ou un ElementsTab.setmodel ?? et je mets ça dans Process ? Je m'y perd :/
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:10
Je sais que quand on bouge une colonne équivaut à peu près à un ElementsTab.repaint(); or quand je la bouge aucune valeur ne s'inscrit dans mon tableau.
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:16
Bon alors ca marche mais comme au début : j'ai changé la déclaration de ma variable en :
public static String statut ;

Mais cela me modifie non pas une ligne mais toutes les lignes.
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 15:16
tu peux déjà initialisé ton status avec une donnée quelconque histoire d'être sur que l'information est prise...

pour faire ton lien entre ton process et ton tableau, tu dois faire en sorte que, par exemple, ton process lance un event lorsque son status change...
ton tableau (ou plutôt son modèle) reçoit cet évènement et met à jour les données affichée via la méthode fireTableDataChanged()

bref, une implémentation de l'observer pattern
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 15:18
normal, une variable static est unique pour toute les instances de cette classe...

je te conseille de faire des getter/setter sur les variables accessibles depuis l'extérieur de la classe et de les déclarées protected (ou private si ta classe est final)
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:19
 public String getStatut(){
            if(statut != null){
                return statut;
            }else{
                return "En attente";
            }
            
        }
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 15:24
et normalement, ce sera la même chose pour ta barre de progression, mais avec la méthode transferred(int length) du FTPDataTransfertListener
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 15:25
je te conseille de faire des getter/setter sur les variables accessibles depuis l'extérieur de la classe


Quelles variables ? Quelle est ta piste ? Je fais mon possible pour comprendre, je sais que je dois être lassant.
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 16:02
     public String getStatut(){
            if(status != null){
                return status;
            }else{
                return "En attente";
            }
            
        }
        public void setStatus(String pNewStatus)
        {
        //appel à la méthode qui averti les différents listeners du changement de la variable.
        firePropertyChange(new PropertyChangeEvent(this, "status", status, pNewStatus));
        
        status = pNewStatus;
        }
        
       public String getSize(long bytes) {
            if (bytes > 1048576) {
                double div = bytes / 1048576;
                return div + " MB";
            } else if (bytes > 1024) {
                double div = bytes / 1024;
                return div + " KB";
            } else {
                return bytes + " bits";
            }
        }

    public void setStatut(String statut) {
        this.status = statut;
    }
    
        private String status ;
    @Override
    public void started() {
        this.setStatus("En cours");
    }

    @Override
    public void transferred(int length) {
      
    }

    @Override
    public void completed() {
        this.setStatus("Transféré");
    }

    @Override
    public void aborted() {
        this.setStatus("Annulé");
    }

    @Override
    public void failed() {
        this.setStatus("Echoué");
    }

    private void firePropertyChange(PropertyChangeEvent propertyChangeEvent) {
        propertyChangeEvent.getNewValue();        
    }
??

Plus tu m'écris des choses plus j'apprends mais moins je connais. J'ai beau être en 2ème année de BTS on n'a rien vu de tout ça (à part getter/setter).
0
cormandyr Messages postés 600 Date d'inscription samedi 20 mai 2006 Statut Membre Dernière intervention 8 juillet 2016 11
29 mars 2012 à 16:15
Je suis désolé ^^ (BTS ne me dit rien du tout, mais c'est pas grave :p)

Au moins tu me comprends, ça me rassure, parfois je parle mais on me comprend pas :'(

Revenons à nos moutons, enfin aux tiens...

il te reste deux choses à faire:
[1] faire en sorte de pourvoir avertir le changement de status
Pour faire simple, tes instances de Process vont avoir une liste de PropertyChangeListener et vont avertir ces listeners des changement de status. A toi de mettre en place le systeme qui permet d'ajouter et de supprimer des listeners. Pour les avertir, tu boucles sur la liste de listener et pour chacun d'eux tu appelles la méthode adéquate avec l'event

[2] faire que la table se rafraichisse lorsque le status change...
ton tableModel doit implémenter l'interface PropertyChangeListener et écouter chacun des process...
quand il reçoit un évènement, tu rafraichis...

je ne peux guère t'aider plus sans le faire à ta place... Utilise la javadoc et les tuto pour ce qui est encore obscure et si vraiment ça va pas, pas de soucis je continuerai à répondre...

Bonne chance
0
cartman29 Messages postés 60 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 4 août 2012
29 mars 2012 à 19:25
Bon je vois pas trop, d'ou sort cette liste de PropertyChangeListener ? Lorsque tu parles de boucle c'est sur quel event ? (pour ce qui est de la méthode c'est soit un ajout, soit une supression des 'listener' ?) j'ai essayé d'ajouter des éléments :

public class Process implements ftp4j.FTPDataTransferListener {

   File file;

    Process(File file) {
        this.file = file;
    }

        public File getFile() {
            return file;
        }
        
        public String getFileName() {
            return file.getName();
        }

        public long getSize() {
            return file.length();        
        }
        
        public String getStatut(){
            if(status != null){
                return status;
            }else{
                return "En attente";
            }
            
        }
        
        public void setStatus(String pNewStatus)
        {
        //appel à la méthode qui averti les différents listeners du changement de la variable.
        firePropertyChange(new PropertyChangeEvent(this, "status", status, pNewStatus));
        status = pNewStatus;
        
        }
        
         
public String getSize(long bytes) {
            if (bytes > 1048576) {
                double div = bytes / 1048576;
                return div + " MB";
            } else if (bytes > 1024) {
                double div = bytes / 1024;
                return div + " KB";
            } else {
                return bytes + " bits";
            }
        }

       
        private String status ;
    @Override
    public void started() {
        this.setStatus("En cours");        
        
    }

    @Override
    public void transferred(int length) {
      
    }

    @Override
    public void completed() {
        this.setStatus("Transféré");
    }

    @Override
    public void aborted() {
        this.setStatus("Annulé");
    }

    @Override
    public void failed() {
        this.setStatus("Echoué");
    }

  
   
 public void addPropertyChangeListener(PropertyChangeListener listener){
     this.addPropertyChangeListener(listener);
 }
 
 public void removePropertyChangeListener(PropertyChangeListener listener){
     this.removePropertyChangeListener(listener);
 } 
 
    
    PropertyChangeListener propertyChangeListener = new PropertyChangeListener() {
      public void PropertyChangeListener(PropertyChangeEvent propertyChangeEvent) {
        Object property = propertyChangeEvent.getNewValue();
        //??
      }

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
           //???
        }
    };

    private void firePropertyChange(PropertyChangeEvent propertyChangeEvent) {
        propertyChangeEvent.getNewValue();  
        System.out.println(propertyChangeEvent.getNewValue());

    }

}
0
Rejoignez-nous