2011-03-08 73 views
1


我需要在Java SWT中为树创建一个弹出菜单。但是菜单应该只在没有选择项目时弹出(当我点击TreeViewer的空白区域时)。如果我现在选择树的一个项目,我不能再取消它的选择。 TreeViewer在Composite中。
我的第一个想法是添加一个MouseListener来检查是否没有选择这些项目,并调用deselectAll(),但event.getSource()只返回树。
任何想法如何删除一个项目选择时,空格被点击(右键)?Java SWT:删除树项目的选择

回答

5

通常情况下,您可以通过Ctlr单击该项目取消选择。

另一种选择是注册鼠标单击的侦听器,并使用事件位置来定位树项目。如果返回null,则可以拨打deselectAll()

但是,如何从Tree获得TreeViewer?简单:将引用存储在树的data属性中。然后你就可以在你的事件处理程序使用此代码:

TreeViewer view = (TreeViewer) event.getSource().getData(); 
+0

谢谢你的快速回复!但是我不能添加一个有用的侦听器到TreeViewer来检查哪个项目被点击。你的想法是什么? – 2011-03-08 10:40:45

+0

您需要将侦听器添加到'Tree'。一个'TreeViewer'只是一个辅助类,它使得在树中显示树模型变得更加简单;大部分工作仍在底层树部件上完成。 – 2011-03-08 11:04:37

+0

也许我不清楚。 MouseListener已经在树上。我需要找出是否点击了一个项目或空白区域(右键点击首选)。如果我尝试使用'((Tree)event.getSource())。getLocation()'获取位置,则无论点击哪处,它都会返回相同的Point。 – 2011-03-08 12:04:40

2

event.getSource()的getLocation()只是告诉你父的树部件的当前位置的坐标系,这就是为什么它总是相同的。您需要从MouseEvent获取点击坐标。它有x和y,这应该是点击坐标。

综上所述:

Tree tree = (Tree) event.getSource(); 
if (tree.getItem(new Point(event.x, event.y)) != null) 
    // an item was clicked. 
else 
    // no item was clicked.