2010-02-27 33 views
0

我試圖創建一個jTable,一旦單擊按鈕,一次只添加一行數字,只是一個從零開始的數字,並繼續添加行直到它獲取行1000000.我正在使用SwingWorker的doInBackground,發佈和處理方法來增加行計數器,並添加每一行,這意味着gui不凍結,而行正在添加。但是,當我運行時,我可以看到行號增加,但它只增加一行並不斷改變這一行,即一行被添加到表中,並且其行號增加,所以我最終以一行結束數量爲1000000.下面是我的SwingWorker代碼,任何hep都會非常感謝,這個問題一直讓我失眠! :/使用SwingWorker將行添加到jTable並更新GUI

//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(); 

回答

4

publish()一遍又一遍荷蘭國際集團一樣Vector對象。一旦你publish()它,你必須創建一個新的。試試這個:

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

     i++;    
     publish(v); 
    } 

    return v; 
} 

解決與跳躍行的問題,你只需要每一個元素在rowsList過程,而不是隻有第一個。像這樣:

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

非常感謝您的回覆,這解決了只有一行被添加到表中的問題。但是,現在行數每行之間增加了幾千,我知道這是因爲每次調用publish()時都不會運行該過程方法,並且這些向量排隊直到調用過程。我不知道如何克服這一點,並添加每一行,從0 - 1000000. – KingCong 2010-02-27 19:55:17

+0

再次感謝您的幫助,它解決了問題! – KingCong 2010-02-28 00:31:13