2014-09-05 2 views
0

Jface TreeViewer에 오른쪽 클릭 메뉴를 올바르게 연결하는 방법에 대해 good thread이 있습니다.클릭 한 노드에 따라 Jface TreeViewer 추가 클릭 메뉴

마우스 오른쪽 버튼이 노드 또는 "빈 공간"에있는 경우 마우스 오른쪽 버튼 클릭 메뉴를 표시하고 싶습니다. 문제는 빈 공간을 클릭하면 TreeViewer가 자동으로 선택을 지우지 않는다는 것입니다. 이것을 달성하는 방법이 있습니까?

내 현재의 접근 방식은 단순히 다음 이는 MouseDown 방법으로 나무에 MouseListener를 연결하는 것입니다 :

@Override 
public void mouseDown(MouseEvent e) { 
    TreeItem item = treeViewer.getTree().getItem(new Point(e.x, e.y)); 
    if (item == null) { 
     treeViewer.getTree().deselectAll(); 
    } 
} 

이 아주 잘 작동하는 것 같다. 이거 어떻게 생각해?

+0

참고 : 당신이 정말로 그것을 수행하려는 경우 그래서, 여기에 가능한 솔루션입니다. 그래서 이것은 파격적인 UX 디자인이 될 것입니다. – Baz

+0

@Baz 나는 당신의 요점을 이해하는지 잘 모르겠습니다. 빈 공간이 없다면 사용자가 항상 노드를 클릭하기 때문에 모든 것이 잘되어야합니다. – user3726374

+0

사용자가 노드를 마우스 오른쪽 버튼으로 클릭하지 않았기 때문에 "빈 공간"에 컨텍스트 메뉴가 필요하지 않습니까? – Baz

답변

0

좋아, 더러운 해결 방법을 발견했습니다. 은`TreeViewer`에 포함 된 항목 수에 따라 전혀 어떤 "빈 공간"이되지 않을 수

final Tree tree = viewer.getTree(); 

final Menu menu = new Menu(tree); 
tree.setMenu(menu); 
menu.addMenuListener(new MenuAdapter() 
{ 
    @Override 
    public void menuShown(MenuEvent e) 
    { 
     Point point = tree.toControl(Display.getDefault().getCursorLocation()); 
     boolean found = false; 
     for (TreeItem item : tree.getItems()) 
     { 
      for (int i = 0; i < tree.getColumnCount(); i++) 
       if (item.getBounds(i).contains(point)) 
        found = true; 
     } 

     System.out.println(found); 
    } 
}); 
+0

좋습니다. 선택 취소하지 않고도 작동합니다. 그러나 아마 deselection 방법만큼 더러운 것 :). – user3726374

+0

@ user3726374이 솔루션은 아마도 덜 performant지만, 나는 그것을 덜 혼란스럽게 생각합니다 :) – Baz

0
How to add popup menu to your SWT/JFace TreeViewer 
Hi, in your applications main class (that extends ApplicationWindow) in protected Control createContents(Composite parent) method you should add code like this: 
//Author: Darius Kucinskas (c) 2008-2009 
//Email: d[dot]kucinskas[eta]gmail[dot]com 
//Blog: http://blog-of-darius.blogspot.com/ 
//License: GPL 

// Create the popup menu 
    MenuManager menuMgr = new MenuManager(); 
    Menu menu = menuMgr.createContextMenu(mTreeViewer.getControl()); 
    menuMgr.addMenuListener(new IMenuListener() { 
    @Override 
    public void menuAboutToShow(IMenuManager manager) { 
     if(mTreeViewer.getSelection().isEmpty()) { 
     return; 
     } 

     if(mTreeViewer.getSelection() instanceof IStructuredSelection) { 
     IStructuredSelection selection = (IStructuredSelection)mTreeViewer.getSelection(); 
     DatabaseModelObject object = (DatabaseModelObject)selection.getFirstElement(); 

     if (object.getType() == DATABASE_OBJECT_TYPE.TABLE){ 
      manager.add(new ShowTableDataAction(SWTApp.this)); 
     } 
     } 
    } 
    }); 

    menuMgr.setRemoveAllWhenShown(true); 
    mTreeViewer.getControl().setMenu(menu); 
DatabaseModelObject - is class from my problem domain (specific to my program). mTreeViewer - is object of TreeViewer class (JFace). Thanks, have a nice day!