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 に答える