2010-02-27 7 views
0

J'essaie de créer une jTable qui, une fois qu'un bouton est cliqué, ajoute les lignes une à la fois avec juste un nombre commençant à zéro et continue d'ajouter des lignes jusqu'à ce qu'il obtienne à row 1000000. J'utilise les méthodes doInBackground, publish et process de SwingWorker pour incrémenter le compteur de lignes et ajouter chaque ligne, ce qui signifie que le GUI ne gèle pas lorsque les lignes sont ajoutées. Cependant, quand je cours, je peux voir le numéro de ligne incrémenter mais il ne fait qu'ajouter une ligne et continue de changer cette ligne, ie une ligne est ajoutée à la table et son numéro de ligne s'incrémente donc je finis avec une rangée à la fin avec un Voici le code de mon SwingWorker, n'importe quel hep serait grandement apprécié, ce problème m'a donné des nuits blanches !! :/Utiliser SwingWorker pour ajouter des lignes à jTable et mettre à jour l'interface graphique

//inside the button's ActionPerformed method 

    SwingWorker<Vector, Vector> worker = new SwingWorker<Vector, Vector>() { 

    @Override 
    protected Vector doInBackground() 
    {  
     int i = 0; 
     Vector v = new Vector(); 
     //while(!isCancelled()) 
     while(i < 100000000) 
     { 
      v.clear(); 
      //v = gen.runAlgorithm2(); 
      v.add(i); 

      i++;    
      publish(v); 
     } 

     return v; 
    } 

    @Override 
    protected void process(List rowsList) 
    { 
     if(rowsList.size() > 0) 
     { 
      Vector row = (Vector)rowsList.get(rowsList.size() - 1); 
      DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel(); 

      //tModel.insertRow(0, row); 
      tModel.addRow(row);    
     } 

    } 
    }; 
    worker.execute(); 

Répondre

4

Vous êtes publish() ing le même objet Vector encore et encore. Une fois que vous l'avez, vous devez en créer un nouveau. Essayez ceci:

@Override 
protected Vector doInBackground() 
{  
    int i = 0; 
    while(i < 100000000) 
    { 
     Vector v = new Vector(); 
     v.add(i); 

     i++;    
     publish(v); 
    } 

    return v; 
} 

Pour résoudre le problème avec des lignes sautées, vous avez juste besoin de traiter chaque élément rowsList, plutôt que seul le premier. Comme si:

@Override 
protected void process(List<Vector> rowsList) 
{ 
    for(Vector row : rowsList){ 
     DefaultTableModel tModel = (DefaultTableModel)jTable1.getModel(); 
     tModel.addRow(row);    
    } 
} 
+0

Merci beaucoup pour votre réponse, cela a résolu le problème d'une seule ligne étant ajouté à la table. Cependant, maintenant les numéros de ligne incrémentent quelques milliers entre chaque ligne, je comprends c'est parce que la méthode de processus n'est pas exécutée chaque fois que publish() est appelé et que les vecteurs sont mis en attente jusqu'à ce que le processus soit appelé. Je ne sais pas comment je pourrais surmonter cela et ajouter chaque ligne, de 0 - 1000000. – KingCong

+0

Merci encore pour votre aide, il a résolu le problème! – KingCong