2010-04-25 5 views
2

마우스 오른쪽 버튼 이벤트를 캡쳐하여 컨텍스트 메뉴를 표시합니다. 내가 알아낼 수 없었던 것은 컨텍스트 메뉴를 표시하기 전에 마우스 오른쪽 단추로 실제로 TreeItem을 선택하는 것입니다.GWT : 마우스 오른쪽 버튼으로 TreeItem을 선택하십시오.

모든 도움을 주실 수 있습니다.

private Tree tree = new Tree() { 
    @Override 
    public void onBrowserEvent(Event event) { 
    if (event.getTypeInt() == Event.ONCONTEXTMENU) { 
    DOM.eventPreventDefault(event);   
    showContextMenu(event); 
    } 
    super.onBrowserEvent(event); 
    } 

    @Override 
    protected void setElement(Element elem) { 
    super.setElement(elem); 
    sinkEvents(Event.ONCONTEXTMENU); 
    } 

}; 

답변

1

ONMOUSEDOWN 이벤트가 ONCONTEXTMENU보다 먼저 발생합니다. onMouseDown 이벤트를 수신하려고 시도 했습니까? 선택한 항목을 설정 했습니까? 이 라인을 따라 뭔가 :

@Override 
public void onBrowserEvent(Event event) { 
switch (DOM.eventGetType(event)) { 
    case Event.ONMOUSEDOWN: 
     if (DOM.eventGetButton(event) == Event.BUTTON_RIGHT) { 
      TreeItem selectedItem = findSelectedItem(event); 
      if (selectedItem != null) { 
       selectedItem.setSelected(true); 
      } 
     } else { 
      super.onBrowserEvent(event); 
     } 
     break; 
    case Event.ONCONTEXTMENU: 
     showContextMenu(event); 
     break; 
    default: 
     super.onBrowserEvent(event); 
     break; 
    } 

및 findSelectedItem 선택한 항목을 찾고 트리 순회 :

TreeItem findSelectedItem(Event e) { 
    return findSelectedItemRecursive(event.getClientX(), event.getClientY()); 
} 

TreeItem findSelectedTreeItemRecursive(TreeItem root, int x, int y) { 
    if (null == root) { 
     int count = getItemCount(); 
     for (int i = 0; i < count; i++) { 
      TreeItem selected = findSelectedTreeItemRecursive(getItem(i), x, y); 
      if (selected != null) { 
       return selected; 
      } 
     } 
     return null; 
    } 
    int count = item.getChildCount(); 
    for (int i = 0; i < count; i++) { 
     TreeItem selected = findSelectedTreeItem(item.getChild(i), x, y); 
     if (selected != null) { 
      return selected; 
     } 
    } 

    if (x >= item.getAbsoluteLeft() 
     && x <= item.getAbsoluteLeft() + item.getOffsetWidth() 
     && y >= item.getAbsoluteTop() 
     && y <= item.getAbsoluteTop() + item.getOffsetHeight()) { 
     return item; 
    } 
    return null; 
} 
1

할 수 있습니다 전용 오버로드 TreeItem 사용

public class MyTreeItem extends TreeItem implements ContextMenuHandler { 


    public SBTreeItem(SBItemTree tree, String name) { 
     super(); 
     Label w = new Label(name); 
     w.addDomHandler(this, ContextMenuEvent.getType()); 
     setWidget(w); 
    } 

      public void onContextMenu(ContextMenuEvent event) { 
     Window.alert(getSBItem().getName()); 
     event.getNativeEvent().stopPropagation(); 

    } 

    } 
0

나는 이것이 오래된 질문이라는 것을 알고 있지만 잘하면 여기에 대중이 Google 검색에서이 페이지를 때리는 시간을 절약 할 수있는 대답이 있습니다. IMO, 가장 좋은 방법은 Google 고유의 내부 트리 검색 코드를 사용하는 것입니다.이 방법은 트리의 요소 수와 잘 일치하는 솔루션입니다. I GWT 2.5.1을 사용 중입니다.

private void initTree() { 
    tree = new Tree() { 

     @Override 
     public void onBrowserEvent(Event event) { 
      /* 
      * If the event is a context menu event, we want the tree item 
      * to also be selected. 
      * 
      * This logic must occur before the call to the superclass 
      * method so the selection is updated before the context menu 
      * logic executes. This is useful when we want to make items in 
      * the context menu invisible/disabled based on the selection. 
      */ 
      if (DOM.eventGetType(event) == Event.ONCONTEXTMENU) { 
       if (getItemCount() > 0) { 
        // In my use case there is only 1 top-level tree item 
        TreeItem root = getItem(0); 

        // Taken from com.google.gwt.user.client.ui.Tree.elementClicked(Element): 
        ArrayList<Element> chain = new ArrayList<Element>(); 
        collectElementChain(chain, getElement(), DOM.eventGetTarget(event)); 

        TreeItem selection = findItemByChain(chain, 0, root); 

        /* 
        * For some reason SelectionEvent will only fire if 
        * selection is non-null; I am firing the selection 
        * event manually because I want to know when there has 
        * been a deselection of an item in the tree. 
        */ 
        if (selection != null) { 
         this.setSelectedItem(selection); 
        } else { 
         SelectionEvent.fire(this, null); 
        } 
       } 
      } 

      super.onBrowserEvent(event); 
     } 

    }; 

    tree.setAnimationEnabled(true); 
} 


//// BEGIN code copied from com.google.gwt.user.client.ui.Tree: 

/** 
* Collects parents going up the element tree, terminated at the tree root. 
*/ 
private void collectElementChain(ArrayList<Element> chain, Element hRoot, 
     Element hElem) { 
    if ((hElem == null) || (hElem == hRoot)) { 
     return; 
    } 

    collectElementChain(chain, hRoot, DOM.getParent(hElem)); 
    chain.add(hElem); 
} 

private TreeItem findItemByChain(ArrayList<Element> chain, int idx, 
     TreeItem root) { 
    if (idx == chain.size()) { 
     return root; 
    } 

    Element hCurElem = chain.get(idx); 
    for (int i = 0, n = root.getChildCount(); i < n; ++i) { 
     TreeItem child = root.getChild(i); 
     if (child.getElement() == hCurElem) { 
      TreeItem retItem = findItemByChain(chain, idx + 1, 
        root.getChild(i)); 
      if (retItem == null) { 
       return child; 
      } 
      return retItem; 
     } 
    } 

    return findItemByChain(chain, idx + 1, root); 
} 

//// END 
관련 문제