Zk从选定选项卡中删除事件侦听器

时间:2013-01-17 05:42:50

标签: java zk

我有2个选项卡,一个是Parent选项卡,另一个是子选项卡。我创建了Parent选项卡,并使用onClose事件将侦听器动态地添加到它,然后创建子选项卡。实际上我想要当用户点击Tab的关闭按钮时,他无法关闭并获取消息,所以我将event.stopPropogation()用于处理close事件。创建子选项卡后,应从父选项卡中删除事件侦听器。但是侦听器不会从父选项卡中删除。因为我正在使用removeEventlistener,但它也无法正常工作。

第一次我正在调用一个方法,我将事件监听器添加到父选项卡。

 mainTab.getSelectedTab().addEventListener(Events.ON_CLOSE,
                new EventListener<Event>() {
                    public void onEvent(Event event) throws Exception {

    event.stopPropogation();
        showWarning(message);
    return;

}
                });

然后在创建所有子选项卡后,我必须删除此侦听器。我正在使用...

mainTab.getSelectedTab().removeEventListener(Events.ON_CLOSE,
                    new EventListener<Event>() {
                        public void onEvent(Event event) throws Exception {



    }
                    });

此侦听器无法在此选项卡上运行,但是当我打开新选项卡(主选项卡的同级)时,不会调用侦听器。

如何从当前标签中删除监听器?

任何人都可以解决我的问题吗?

2 个答案:

答案 0 :(得分:1)

感谢这个例子,这有很大帮助。 这里的问题在于使用removeEventListener函数。函数的第二个参数EventListener实例,实际上是将被删除的 exact 事件侦听器。你可以在ZK源代码中看到这个; removeEventListener函数在AbstractComponenton line 2140中实现,它检查已知EventListener equals函数参数。

这是一个有效的修复方法:

public class Controller extends SelectorComposer<Window> {

 private static final EventListener<Event> EVENT_STOPPER = new EventListener<Event>() {
   public void onEvent(Event event) throws Exception {
        event.stopPropagation();
        System.out.println("Stopped propagation of " + event);
   }
 };

 @Wire
 private Tabbox mainTab;

 @Override
 public void doAfterCompose(Window comp) throws Exception {
   super.doAfterCompose(comp);
   addCloseEventStopper();
 }

 @Listen(Events.ON_CLICK + " = #addTabsButton")
 public void addTabsButtonClicked() {
   removeCloseEventStopper();
   addTabs();
 }

 private void addCloseEventStopper() {
   mainTab.getSelectedTab().addEventListener(Events.ON_CLOSE, EVENT_STOPPER);
 }

 private void removeCloseEventStopper() {
   mainTab.getSelectedTab().removeEventListener(Events.ON_CLOSE, EVENT_STOPPER);
 }

 private void addTabs() {
   Tabs tabs = mainTab.getTabs();
   tabs.appendChild(new Tab("Tab Two"));
   tabs.appendChild(new Tab("Tab Three"));
 }

}

这里的关键是EventListeneraddEventListener使用了相同的removeEventListener实例。

请注意,我们使用了private static final内部类,这只是保持对EventListener的引用的一种方法。根据您的使用情况,还有其他方法。

答案 1 :(得分:0)

基本上你可以调用tab.setClosable(false)来删除'x'(关闭按钮),如果你想要一个不能用'x'关闭的标签,你可以用setWidgetOverride <停止客户端的关闭动作/ p>

下面的zul示例,您可以将setWidgetOverride移动到您可以接收该选项卡实例的任何位置

<zk>
    <tabbox>
        <tabs>
            <tab label="unclosable tab" closable="true">
                <attribute name="onCreate">
                    self.setWidgetOverride("_doCloseClick", "function(evt) { return; }");
                </attribute>
            </tab>
        </tabs>
    </tabbox>
</zk>