0

最後のタブがコントロールに新しいタブを追加する特別な「+」タブであるという点で、Firefoxのように機能させようとしているTabNavigatorがあります。これを行うには、を使用して取得した最初のタブのボタンにイベントハンドラーを追加しますtabNavigator.getTabAt(0).addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false)。優先度をに設定したint.MAX_VALUEので、自分のメソッドが最初に呼び出され、その後、を使用して他のハンドラーが呼び出されないようにすることができますstopImmediatePropagation()

私の問題は、時々クリックハンドラーが呼び出されず、代わりに通常のロジックが実行され、[+]タブがに切り替えられることです。

CustomTabのコード(私は多くのプロプライエタリコードを削除しました):

private var addTab:Function = null;
private var tabCreationAllowed:Boolean = true;

private function onCreationCompleted():void {
    var tabButton:Button = getTab(0);
    Container(getChildAt(0)).setStyle("closable", false);
    tabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);
    tabButton.addEventListener(MouseEvent.DOUBLE_CLICK, function(event:MouseEvent):void {event.stopImmediatePropagation(); }, false, int.MAX_VALUE, false);
}

private function clickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation();
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {
        this.tabCreationAllowed = false;
        this.addTab();
        var $this:CustomTab = this;
        setTimeout(function ():void {
            $this.tabCreationAllowed = true;
        }, 1500);
    }
}
4

1 に答える 1

0

多くの異なることを試した後、問題を最もよく理解できるのは、タブボタンの作成TabBarTabNavigator使用すると、タブを追加または削除する場合にのみ、どのボタンが何を実行するか(場合によっては削除と追加)を切り替えることができるということです。この問題を解決するために、「+」ボタンをクラス変数に格納します。次に、すべてのaddメソッドとremoveメソッドをオーバーライドします。それぞれで、ボタンからすべてのイベントリスナーを削除するメソッドを呼び出します。イベントリスナーがある場合は、変数を最後のタブのボタン(「+」タブ)に設定してから、リスナーを再度追加します。

最終的なコードの縮小版:

private var addTab:Function = null;  
private var tabCreationAllowed:Boolean = true;  
private var addTabButton:Button = null;

private function prerAddTabButton():void {
    if (addTabButton != null) {
        addTabButton.removeEventListener(MouseEvent.CLICK, clickFunction);
        addTabButton.removeEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction);
    }
    addTabButton = getTabAt(numChildren - 1);
    addTabButton.addEventListener(MouseEvent.CLICK, clickFunction, false, int.MAX_VALUE, false);  
    addTabButton.addEventListener(MouseEvent.DOUBLE_CLICK, doubleClickFunction, false, int.MAX_VALUE, false);  
}

private function onCreationCompleted():void {  
    var tabButton:Button = getTab(0);  
    Container(getChildAt(0)).setStyle("closable", false);
    prerAddTabButton();
}  

private function doubleClickFunction(event:MouseEvent):void {
    event.stopImmediatePropagation(); 
}

private function clickFunction(event:MouseEvent):void {  
    event.stopImmediatePropagation();  
    if (this.tabCreationAllowed && (this.addTab != null) && (event.eventPhase == EventPhase.AT_TARGET)) {  
        this.tabCreationAllowed = false;  
        this.addTab();  
        var $this:CustomTab = this;  
        setTimeout(function ():void {  
            $this.tabCreationAllowed = true;  
        }, 1500);  
    }  
}
于 2012-05-02T14:22:31.847 に答える