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

SWT/JFace Java Discussion :

[TableEditor] Problème de refresh


Sujet :

SWT/JFace Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 18
    Points : 20
    Points
    20
    Par défaut [TableEditor] Problème de refresh
    Bonjour,

    Je travaille actuellement sur un logiciel de gestion de projet utilisant Java SWT.

    J'utilise entre autres des SWT Table, TableViewer, TableEditor pour attribuer à des utilisateurs des volumes horaires par tâche avec un tableau à double entrée.

    Quand l'utilisateur fait Clic droit > Voir fiche projet sur le projet, le programme remplit ce tableau de "0" et accède bien à la base de données, puis envoie les données recueillies dans le tableau (remplaçant les "0" non désirés). Cela marche bien et fait exactement ce que je veux. Comme vous pouvez le voir sur ce screenshot il y a bien une concordance entre la base de données et mon Table.




    Le problème, est que quand je fais Clic droit > Voir fiche projet sur un autre projet, je veux que les nouveaux temps de travail attribués remplacent les anciens mais ça ne marche pas : pour un 2ème projet je vois toujours les temps attribués au premier projet. En gros mon tableau ne se refresh pas.

    Avec un simple débug 'SOP', je vois clairement que la boucle de 'setText("0")' supposée écraser les anciennes valeurs est atteinte mais on dirait qu'elle n'a pas d'effet. En fait, je me suis rendu compte plus tard qu'elle a l'effet d'ajouter de nouvelles lignes "fantômes" à mon tableau, qui sont vides. Cela est probablement dû au fait que mon Text[] texte est un tableau et quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    texte = new Text(table2, SWT.NONE);
    ça se stack, générant les lignes vides. Je ne comprends pas cependant pourquoi ces lignes sont vides.



    Voici maintenant à quoi ressemble la fonction incriminée.
    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
    public void fillSubtasks(Task selectedTask) throws DbException {
     
        table2.clearAll();
     
        // I generate items to put the name of the subtasks corresponding to a project
        for (int j = 0; j < selectedTask.getSubTasksCount(); j++) {
            new TableItem(table2, SWT.NONE);
        }
        // I fill items with subtasks names
        items = table2.getItems();
        final Task[] subtasktable = ModelMgr.getSubtasks(selectedTask);
        for (int i = 0; i < selectedTask.getSubTasksCount(); i++) {
            items[i].setText(subtasktable[i].getName());
        }
     
        DbTransaction tx = DbMgr.beginTransaction();
        // I store the users registered in the software
        final Collaborator[] collabs = DbMgr.getCollaborators(tx, 1, true, true);
        DbMgr.commitTransaction(tx);
        DbMgr.endTransaction(tx);
     
        for (int i = 0; i < collabs.length; i++) {
            for (int j = 0; j < selectedTask.getSubTasksCount(); j++) {
     
                final int cit = i;
                final int cjt = j;
     
                tx = DbMgr.beginTransaction();
     
                editor = new TableEditor(table2);
                editor.grabHorizontal = true;
     
                final Text texte = new Text(table2, SWT.NONE);
                // Fill with "0"s
                texte.setText("0");
                // Replace it if a contribution exists in the DB
                if (DbMgr.attributedTaskExists(tx, collabs[i], subtasktable[j]) != 0) {
                    texte.setText(String.valueOf(DbMgr.getAttributedTask(tx, collabs[cit].getLogin(), subtasktable[cjt])));
                }
                DbMgr.commitTransaction(tx);
                DbMgr.endTransaction(tx);
     
                texte.addModifyListener(new ModifyListener()
                    {
                        public void modifyText(ModifyEvent evt) {
     
                            System.out.println("text " + texte.getText());
                            try {
                                DbTransaction tx = DbMgr.beginTransaction();
     
                                DbMgr.getAttributedTask(tx, collabs[cit].getLogin(), subtasktable[cjt]);
                                DbMgr.updateAttributedTask(tx, collabs[cit].getLogin(), subtasktable[cjt], Integer.parseInt(texte.getText()));
                                DbMgr.commitTransaction(tx);
                                DbMgr.endTransaction(tx);
     
                            }
                            catch (DbException e) {
                                e.printStackTrace();
                            }
                        }
                    });
                editor.setEditor(texte, items[j], i + 1);
            }
        }
        k++;
    }
    Que puis-je faire pour éviter ça ?

    Merci d'avance pour votre aide.

  2. #2
    Membre du Club Avatar de dark.jabberwock
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2009
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 38
    Points : 61
    Points
    61
    Par défaut
    Bonjour,

    J'ai lu sur ton autre post que ton problème SWT ne trouvait pas de réponses.

    Je ne m'y connais pas énormément mais je viens de regarder un peu le début de ta fonction et je pense avoir une piste pour tes lignes supplémentaires qui apparaissent.

    Tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        table2.clearAll();
     
        // I generate items to put the name of the subtasks corresponding to a project
        for (int j = 0; j < selectedTask.getSubTasksCount(); j++) {
            new TableItem(table2, SWT.NONE);
        }
    je suppose que table2 est un Table (je n'ai pas la certitude vu l'extrait de code).

    Or après une lecture de la javadoc du Table, il me semble la fonction clearAll() ne supprime pas les TableItem que tu as précédemment créé.

    clearAll

    public void clearAll()

    Clears all the items in the receiver. The text, icon and other attributes of the items are set to their default values. If the table was created with the SWT.VIRTUAL style, these attributes are requested again as needed.
    Donc je pense que la création de ligne supplémentaire vient de là.

    Pour le problème de rafraichissement des données, je n'ai pas regardé.

    Bon courage

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/11/2006, 10h34
  2. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57
  3. Problème de refresh
    Par squallJ dans le forum Oracle
    Réponses: 2
    Dernier message: 17/01/2006, 16h28
  4. problème de refresh sur une DBGrid
    Par lidouka dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/12/2005, 17h12
  5. [TColorBox] : problème de refresh
    Par PpPool dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/08/2005, 11h09

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