Canvas 在SmartGWT中,什么事件告诉您是否正在绘制某些内容?

Canvas 在SmartGWT中,什么事件告诉您是否正在绘制某些内容?,canvas,contextmenu,smartgwt,treegrid,Canvas,Contextmenu,Smartgwt,Treegrid,例如,我有一个TreeGrid,我在TreeGrid中添加了一个ContextMenu。现在,我只想在用户右键单击叶节点时绘制ContextMenu。我的想法是检测何时将绘制上下文菜单,并检查右键单击的节点是否为叶节点: 如果节点是叶,则绘制ContextMenu 如果节点不是叶,请取消绘制 但哪个事件处理组件的绘图 更新: showContextMenuHandler无法工作。实际上,这是一个SmartGWT错误,因为如果我说contextMenu.show(),我实际上会得到两个上下文菜

例如,我有一个
TreeGrid
,我在
TreeGrid
中添加了一个
ContextMenu
。现在,我只想在用户右键单击叶节点时绘制
ContextMenu
。我的想法是检测何时将绘制
上下文菜单
,并检查右键单击的节点是否为叶节点:

  • 如果节点是叶,则绘制
    ContextMenu
  • 如果节点不是叶,请取消绘制
但哪个事件处理组件的绘图

更新:

showContextMenuHandler
无法工作。实际上,这是一个
SmartGWT
错误,因为如果我说contextMenu.show(),我实际上会得到两个上下文菜单:一个来自
SmartGWT
(我制作的一个),另一个是浏览器的,其中包含以下元素(下一页、上一页、全选、页面源等等)。这同样适用于
LeafContextClickHandler

这就是为什么我想为ContextMenu本身添加一个绘图处理程序,以防止它在特殊情况下绘图

下面是一张解释该错误的图片:


有几种方法可以做到这一点。必须有对正在绘制的构件的引用。然后,您可以添加一个DrawHandler VisibilityChangedHandler,或者在本例中添加一个ShowContextMenuHandler


但在您的示例中,我认为实现上述机制的更好方法是在TreeGrid上使用LeafClickHandler和FolderClickHandler。

您对ShowContextMenuHandler的问题不是一个bug,而是SmartGWT的一个“功能”。在任何情况下,如果您不想显示浏览器的菜单,您所要做的就是停止事件向浏览器的传播。这可以通过以下代码片段轻松实现:

addShowContextMenuHandler(new ShowContextMenuHandler() {

        @Override
        public void onShowContextMenu(ShowContextMenuEvent event) {
            //Do not propagate to the browser's menu!
            event.cancel();
            //Continue with your code .... 
        }
    }

我显示的照片是由您提供的代码引起的
event.cancel
只需取消我的上下文菜单,但保留浏览器的上下文菜单,如果我不取消,我只需绘制它,然后在TreeGrid上对其进行测试,结果正常。您只需在事件.cancel()之后调用Menu.showContextMenu()方法。如果你仍然不能使它工作,请张贴一个更大的片段,这样我可以更好地指导你使这项工作。