2013-05-18 17 views
1

我通過互聯網搜索,但沒有看到任何單一的職位討論這個非常有用的話題。這是我的問題。當節點的深度未知(GWT)時,如何遍歷Tree小部件?

我得到了有關於TreeItem的孩子根本&的CheckBox樹。

我希望當用戶檢查TreeItem的根檢查框時,然後檢查所有子CheckBox &的子根檢查框。

例如,看這張圖片。 CheckBox Tree

我想的是,當用戶選擇「層次1」複選框,然後「等級11」 &「等級111」 &「等級112」的複選框被選中。當用戶取消選擇「級別1」複選框然後「級別11」&「級別111」&「級別112」複選框未選中。

當用戶選中「Main」後,所有的孩子(「Level 1」,「Level 11」,「Level 111」&「Level 112」,「Level 2」,「Level 21」)已經過檢查。當用戶取消選中「主」時,它將取消選中所有的孩子。

但是,當用戶選中「2級」,那麼只有「21級」進行了調查。

:樹的深度是未知的先進。

這是數據代碼:

Tree myTree=new Tree(); 
TreeItem item1=new TreeItem(new CheckBox("Main")); 
myTree.addItem(item1); 
TreeItem item2=new TreeItem(new CheckBox("Level 1")); 
item1.addItem(item2); 
TreeItem item3=new TreeItem(new CheckBox("Level 11")); 
item2.addItem(item3); 
item3.addItem(new CheckBox("Level 111")); 
item3.addItem(new CheckBox("Level 112")); 

TreeItem item6=new TreeItem(new CheckBox("Level 2")); 
item6.addItem(new CheckBox("Level 21")); 
item1.addItem(item6); 

這是我研究的代碼,但它僅變爲1個電平

Iterator<Widget> widgetsOfTree=myTree.iterator(); 

    TreeItem myTreeItem=myTree.getItem(0); 
    for (int c=0; c<myTreeItem.getChildCount(); c++){ 
     TreeItem childTreeItem=myTreeItem.getChild(c); 
     CheckBox myCheckBox=(CheckBox)childTreeItem.getWidget(); 
    } 

這是基於所提供的traverseTree方法附加代碼Mayank Pandya。當我單擊「Main」或「Level 1」或「Level 2」複選框時,此代碼有效,但當單擊其他複選框時它無法正常工作。例如,當點擊「Level 11」時沒有選擇任何東西。

myCheckBox.addClickHandler(new ClickHandler(){ 

     @Override 
     public void onClick(ClickEvent event) { 


      for(int i=0; i<myTree.getItemCount(); i++){ 
       TreeItem myTreeItem = myTree.getItem(i); 

       for (int c=0; c<myTreeItem.getChildCount(); c++){ 
        TreeItem categoryTreeItem=myTreeItem.getChild(c); 
        CheckBox subCB=(CheckBox)categoryTreeItem.getWidget(); 

        if(myCheckBox==subCB){ 

         traverseTree(categoryTreeItem, myCheckBox.isChecked()) ; 
        } 
       } 


      } 
    } 

    }); 

相信很多人都在尋找這個問題&希望我的問題可以幫助很多人。

回答

1

你可以試試這種遞歸函數的遍歷樹。

public void traverseTree(TreeItem item, Boolean checkValue) 
{ for(int i = 0; i < item.getChildCount(); i++) 
    {  

      // do action here 
      TreeItem childTreeItem=item.getChild(i); 
      CheckBox myCheckBox=(CheckBox)childTreeItem.getWidget(); 
      myCheckBox.setChecked(checkValue); 

      // recursive call for current node. 
      traverseTree(childTreeItem,checkValue); 
    } 
} 

根據您的代碼,您可以使用。

myCheckBox.addClickHandler(new ClickHandler(){ 

    @Override 
    public void onClick(ClickEvent event) { 

     for(int i=0; i<myTree.getItemCount(); i++){ 
      TreeItem myTreeItem = myTree.getItem(i); 
      CheckBox subCB=(CheckBox)myTreeItem.getWidget(); 

      if(myCheckBox==subCB){ 
       traverseTree(myTreeItem, myCheckBox.isChecked()) ; 
      } 
     } 
    } 

});

+0

你好,非常感謝你的幫助,但是當用戶在點擊複選框那麼我們如何才能識別TreeItem此複選框屬於? – Tum

+0

我剛剛編輯了我的問題以包含基於您的traverseTree方法的代碼。請看看有什麼不對嗎? – Tum

+0

我認爲,我們需要使用一些遞歸的解決方案來識別TreeItem一個複選框屬於 – Tum