2011-08-26 18 views
1

我正在使用jTree結構來顯示用戶當前正在使用的項目的結構。用戶當然可以打開另一個項目,然後該軟件應該顯示新項目的結構。我正在使用DefaultTreeModel添加/刪除節點,並更新jTree結構。由於這項任務可能需要幾秒鐘才能完成,因此在新的Thread中實施。下面的代碼:如何從Thread對象重繪一個jTree?

class DrawTreeThread extends Thread { 
    @Override 
    public void run() { 
     System.out.println("drawing the tree"); 
     model = (DefaultTreeModel) jTree1.getModel(); 
     Fichier obs, 
       open, 
       opens = new Fichier(Batiment.data.getAbsolutePath() + "\\Open"), 
       obss = new Fichier(Batiment.data.getAbsolutePath() + "\\Obs"), 
       rooms = new Fichier(Batiment.data.getAbsolutePath() + "\\Rooms"); 
     Fichier bd = new Fichier(Batiment.data.getAbsolutePath() + "\\BuildingData" + Fichier.EXT); 

     int size = rooms.listFiles().length; 
     int nbrEtage = bd.readInt("etage"); 

     DefaultMutableTreeNode[] roomz = new DefaultMutableTreeNode[size]; 
     DefaultMutableTreeNode bat = new DefaultMutableTreeNode(Batiment.data.getAbsoluteName()); 
     DefaultMutableTreeNode[] obstacles = new DefaultMutableTreeNode[size]; 
     DefaultMutableTreeNode[] ouvertures = new DefaultMutableTreeNode[size]; 
     DefaultMutableTreeNode[] etages = new DefaultMutableTreeNode[nbrEtage]; 
     jTree1 = new JTree(bat); 

     for (int etageCounter = 0; etageCounter < nbrEtage; etageCounter++) { 
      String name = "RDC"; 
      if (etageCounter != 0) { 
       name += " + " + etageCounter; 
      } 
      etages[etageCounter] = new DefaultMutableTreeNode(name); 
      bat.add(etages[etageCounter]); 
      model.insertNodeInto(etages[etageCounter], bat, 0); 
     } 


     for (int i = 0; i < size; i++) { 
      roomz[i] = new DefaultMutableTreeNode(rooms.listFiles()[i].getAbsoluteName()); 
      obs = new Fichier(obss.getAbsolutePath() + "\\" + rooms.listFiles()[i].getAbsoluteName()); 
      open = new Fichier(opens.getAbsolutePath() + "\\" + rooms.listFiles()[i].getAbsoluteName()); 
      etages[rooms.listFiles()[i].readInt("etage")].add(roomz[i]); 
      obstacles[i] = new DefaultMutableTreeNode("Obstacles (" + obs.listFiles().length + ")"); 
      ouvertures[i] = new DefaultMutableTreeNode("Ouvertures (" + open.listFiles().length + ")"); 
      roomz[i].add(obstacles[i]); 
      roomz[i].add(ouvertures[i]); 

      DefaultMutableTreeNode[] Obs = new DefaultMutableTreeNode[obs.listFiles().length]; 
      for (int j = 0; j < obs.listFiles().length; j++) { 
       Obs[j] = new DefaultMutableTreeNode(obs.listFiles()[j].getAbsoluteName()); 
       obstacles[i].add(Obs[j]); 
      } 

      DefaultMutableTreeNode[] Open = new DefaultMutableTreeNode[open.listFiles().length]; 
      for (int j = 0; j < open.listFiles().length; j++) { 
       Open[j] = new DefaultMutableTreeNode(open.listFiles()[j].getAbsoluteName()); 
       ouvertures[i].add(Open[j]); 
      } 
     } 

     model.nodeStructureChanged(bat); 
     model.reload(); 

     jTree1.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); 
     jTree1.expandRow(0); 
     System.out.println("drawing the tree with success"); 

    } 
} 

new DrawTreeThread().start()從一個按鈕ActionListner()叫,但什麼也沒有發生。什麼是錯的?

+0

這可能會有助於提及在'run()'的開頭和結尾的兩個'System.out.println()'行顯示正確。 –

回答

3
jTree1 = new JTree(bat); 

這什麼都不做。你所做的只是在內存中創建一個新的JTree對象。您實際上沒有將該樹添加到GUI。

沒有必要創建一棵新樹。相反,你通過創建一個新的TreeModel和更新現有的樹:

tree.setModel(...); 

而且,當你調用上面的方法,你應該把它包在一個SwingUtilities.invokeLater()的GUI被更新的EDT。

+0

非常感謝你,我只是使用了'tree.setModel(...);',它的工作原理應該是這樣:) –