0

2つのタブがあります。1つは親タブで、もう1つは子タブです。親タブを作成し、onCloseイベントを使用してリスナーを動的に配置し、子タブを作成しました。実際、ユーザーがTabの閉じるボタンをクリックすると、閉じてメッセージを受け取ることができないようにしたいので、event.stopPropogation()を配置して閉じるイベントを処理します。子タブの作成後、イベントリスナーを親タブから削除する必要がありますが、リスナーは親タブから削除されていません。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 {



    }
                    });

このリスナーはこのタブで機能していませんが、新しいタブ(メインタブの兄弟)を開くと、リスナーは呼び出されません。

現在のタブからリスナーを削除するにはどうすればよいですか?

誰かが私の問題を解決できますか?

4

2 に答える 2

1

例をありがとう、それは大いに役立ちました。ここでの問題は、removeEventListener関数の使用にありました。関数の2番目の引数であるEventListenerインスタンスは、実際には削除される正確なイベントリスナーです。これはZKソースコードで確認できます。関数は2140行目にremoveEventListener実装されておりAbstractComponent、既知の関数の引数をチェックします。EventListenerequals

動作する修正は次のとおりです。

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"));
 }

}

ここで重要なのは、とで同じEventListenerインスタンスが使用されaddEventListenerていることremoveEventListenerです。

ここではprivate static final内部クラスを使用していることに注意してください。これは、への参照を保持するための1つの方法にすぎませんEventListener。ユースケースに応じて他の方法があります。

于 2013-01-17T13:30:19.503 に答える
0

基本的に、tab.setClosable(false)を呼び出して「x」(閉じるボタン)を削除できます。タブを「x」で閉じることができないようにする場合は、setWidgetOverrideを使用してクライアント側から閉じるアクションを停止できます。

以下の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>
于 2013-01-18T00:51:21.457 に答える