0

我有一个 TreePanel,它分层显示不同类型的对象。地区、城市、位置...

我希望能够在不同级别显示不同的上下文菜单项。例如:区域的 miR,城市的 miC,位置的 miL...我使用这个片段来实现动态结构:

    contextMenu.addListener(Events.BeforeShow, new Listener<MenuEvent>() {
        @Override
        public void handleEvent(MenuEvent be) {
            //First make all menu items invisible
            List<Component> menuItems = contextMenu.getItems();
            for (Component c : menuItems) {
                c.setVisible(false);
            }               

            //And make apprepriate menu items visible
            TopologyTreeElement s = tree.getSelectionModel().getSelectedItem();
            if (s instanceof TopologyTreeElement.Region) {
                miR.setVisible(true);
            }
            if (s instanceof TopologyTreeElement.City) {
                miC.setVisible(true);
            }                                   
        }
    });

但是,在任何级别,如果所有项目都不可见,它会显示一个空框。我希望它不完全显示菜单。我尝试将此代码段添加到该方法中,但它没有提供任何帮助。

            //Do not show menu if no menu item is invisible     
            boolean isMenuShouldBeVisible = miC.isVisible() || miR.isVisible();
            if (!isMenuShouldBeVisible) {
                be.preventDefault();
                be.stopEvent();
            }

任何人都可以提出不同的方法吗?

4

1 回答 1

2

由于您正在收听该BeforeShow事件,因此您可以取消该事件并阻止实际Show事件发生。检查所有项目是否不可见,如果是,请调用be.setCancelled(true).

任何开始的事件Before都可以用来取消后面的事件——这就是为什么这些之前的事件存在的原因。

于 2013-05-22T23:03:41.237 回答