2012-08-02 57 views
3

我写了下面的代码打印树:GWT - 打印树

package test.com.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.logical.shared.SelectionEvent; 
import com.google.gwt.event.logical.shared.SelectionHandler; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.Tree; 
import com.google.gwt.user.client.ui.TreeItem; 
import com.google.gwt.user.client.ui.VerticalPanel; 

/** 
* Entry point classes define <code>onModuleLoad()</code>. 
*/ 
public class TestGwt implements EntryPoint 
{ 
    public static String bc=""; 

    public void onModuleLoad() 
    { 
     VerticalPanel v = new VerticalPanel(); 
     TreeItem a = new TreeItem("A"); 
     TreeItem b = new TreeItem("B"); 
     TreeItem c = new TreeItem("C"); 

     TreeItem d = new TreeItem("D"); 

     TreeItem f1 = new TreeItem("f1"); 
     TreeItem f11 = new TreeItem("f11"); 
     TreeItem f12 = new TreeItem("f12"); 
     d.addItem(f1); 
     f1.addItem(f11); 
     f1.addItem(f12); 


     final Tree t = new Tree(); 
     t.addItem(a); 
     t.addItem(b); 
     t.addItem(c); 
     t.addItem(d); 

     t.addSelectionHandler(new SelectionHandler<TreeItem>() 
     { 
      @Override 
      public void onSelection(SelectionEvent<TreeItem> event) 
      {   
       TreeItem selectedItem= event.getSelectedItem(); 
       if(selectedItem != null) 
       { 
        System.out.println("Selected Item: "+ selectedItem.getText()); 
        TreeItem parentItem = event.getSelectedItem().getParentItem(); 
        t.setSelectedItem(parentItem); 
        parentItem=parentItem.getParentItem(); 

       } 


      } 
     }); 

     v.add(t); 
     // Add it to the root panel. 
     RootPanel.get().add(v); 
    } 
} 

节点d有了子节点F1。 f1具有子节点f11和f12。如果用户选择f12,则应打印:

D> f1> f12。

当所选项目变为D时,我的代码会压缩,因为D没有父项目。如何改进此代码,以便能够根据用户选择哪个节点来引入bradcrumb?

有没有什么办法来检查选定的节点是否是根节点?

非常感谢。 -Maria

更新工作代码:

package test.com.client; 

import com.google.gwt.core.client.EntryPoint; 
import com.google.gwt.event.logical.shared.SelectionEvent; 
import com.google.gwt.event.logical.shared.SelectionHandler; 
import com.google.gwt.user.client.ui.RootPanel; 
import com.google.gwt.user.client.ui.Tree; 
import com.google.gwt.user.client.ui.TreeItem; 
import com.google.gwt.user.client.ui.VerticalPanel; 

/** 
* Entry point classes define <code>onModuleLoad()</code>. 
*/ 
public class TestGwt implements EntryPoint 
{ 
    public static String bc=""; 

    public void onModuleLoad() 
    { 
     VerticalPanel v = new VerticalPanel(); 
     TreeItem a = new TreeItem("A"); 
     TreeItem b = new TreeItem("B"); 
     TreeItem c = new TreeItem("C"); 

     TreeItem d = new TreeItem("D"); 

     TreeItem f1 = new TreeItem("f1"); 
     TreeItem f11 = new TreeItem("f11"); 
     TreeItem f12 = new TreeItem("f12"); 
     d.addItem(f1); 
     f1.addItem(f11); 
     f1.addItem(f12); 


     final Tree t = new Tree(); 
     t.addItem(a); 
     t.addItem(b); 
     t.addItem(c); 
     t.addItem(d); 


     t.addSelectionHandler(new SelectionHandler<TreeItem>() 
     { 
      @Override 
      public void onSelection(SelectionEvent<TreeItem> event) 
      {   
       TreeItem pItem = event.getSelectedItem().getParentItem(); 
       if(pItem == null) 
       { 
        bc+=" > "+event.getSelectedItem().getText(); 
       } 
       else 
       { 
        TreeItem selectedItem= event.getSelectedItem(); 
        if(selectedItem != null) 
        { 
         bc+=" > "+ selectedItem.getText(); 
         TreeItem parentItem = event.getSelectedItem().getParentItem(); 
         t.setSelectedItem(parentItem); 
         parentItem=parentItem.getParentItem(); 

        } 
       }    
      } 
     }); 
     System.out.println(bc); 
     v.add(t); 
     // Add it to the root panel. 
     RootPanel.get().add(v); 
    } 
} 

回答

1

你有这样的代码:

System.out.println("Selected Item: "+ selectedItem.getText()); 
TreeItem parentItem = event.getSelectedItem().getParentItem(); 
t.setSelectedItem(parentItem); 
parentItem=parentItem.getParentItem(); 

您需要检查是否parentItem为null。如果它为空,那么它就是根。类似这样的:

TreeItem parentItem = event.getSelectedItem().getParentItem(); 
if (parentItem == null) { 
    // then it is the root; special root-handling instructions would go here 
} else { 
    // then it is NOT the root 
} 
+0

非常感谢。它确实有效。现在我的问题是,如果我想从addSelectionhandler方法的外部打印出树,那我该怎么做呢?我有一个静态私有字符串,它获取节点名称,但是当我离开selectionHandler方法时,我无法打印它们。谢谢 – Maria 2012-08-02 15:59:57

+0

@Maria - 如果你从树中的任意节点开始,例如。 'TreeItem A',你可以打印来自该节点的路径。或者,您可以将打印逻辑移动到自己的方法中,例如'printTreeFromNode(TreeItem节点)'并将TreeItem传递给它。 – 2012-08-02 16:07:54

+0

我想向上打印树,这意味着从根节点到选定节点。 – Maria 2012-08-02 16:48:40