2014-09-05 81 views
0

有一個good thread關於如何正確掛鉤右擊菜單到Jface TreeViewer取決於所選項目。Jface TreeViewer添加右鍵單擊菜單,具體取決於點擊節點

我想顯示右鍵單擊菜單取決於:如果右鍵單擊在節點上或「空白空間」。問題在於,如果您單擊空白空間,TreeViewer不會自動清除選擇。有沒有什麼乾淨的方式如何實現這一目標?

我目前的做法是簡單地掛上一個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

注意,可能沒有任何「空白空間」可言,這取決於'TreeViewer'多少項目包含的內容。所以這種情況與用戶體驗設計一樣糟糕。 – Baz 2014-09-05 10:08:32

+0

@Baz我不確定我是否理解你的觀點。如果沒有空的空間,那麼一切都應該沒問題,因爲用戶總是點擊一個節點? – user3726374 2014-09-05 10:21:52

+0

因此,您不需要在「空白空間」中使用上下文菜單,因爲用戶沒有右鍵單擊某個節點? – Baz 2014-09-05 10:23:28

回答

0

好吧,我發現一個骯髒的解決方法。所以,如果你真的想這樣做,這裏是一個可能的解決方案:

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

好的,即使沒有添加取消選擇的作品。但可能像取消選擇一樣骯髒:)。 – user3726374 2014-09-05 11:42:12

+0

@ user3726374此解決方案可能性能較差,但我認爲它會混淆用戶少:) – Baz 2014-09-05 11:56:29

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!