2009-12-18 33 views
2

我有一個註冊偵聽來自用戶的鍵盤事件的自定義組件TitleWindow調試對焦和事件傳播(使ESC關閉該窗口中,輸入保存等)。然而,在我的測試中,我發現了一些情況,我的鍵盤事件處理程序不會觸發。Flex中

我最好的猜測,爲什麼發生這種情況是有一些子組件的地方,偷了焦點並從傳播停止鍵盤事件。不幸的是,由於我的TitleWindow中有大量的組件,因此我無法很好地知道是誰偷了焦點。

我的問題然後,有什麼好的技巧/技術/在Flex中調試焦點問題,事件傳播工具?基本上,我需要一些能夠告訴我在任何特定時間誰關注誰以及誰在任何特定時間處理事件的情況......這是可能的嗎?

回答

1

利用Focus Manager您可以調用getFocus(),您將收到當前擁有焦點的IFocusManagerComponent

從那裏,可以確定哪些對象類型已通過使用flash.utils.getQualifiedClassName()並據此採取行動被盜焦點。

至於事件處理在任何給定的時間,要與e.currentTarget e.target比較。

+0

感謝,Tegeril,通過使用FocusManager,然後我就能夠發現誰偷的焦點,並消耗鍵盤事件,問題解決了!我會提到有關事件處理解決方案的一件事是,因爲我的處理程序沒有被調用,所以我沒有地方斷點並檢查e.target和e.currentTarget。當您控制派發事件的項目和處理事件的項目時,這是非常棘手的情況! – Dan

+0

啊,關於這個事件非常好。我想不出一種方法來捕捉非冒泡事件,如果他們發射你沒有聽到的物體,也許有人可以提供一些輸入和啓發我們兩個:) – Aaron

0

我剛剛發現了以下技術可在調試焦點問題非常有幫助:

private function handleTextInputFocus(event:FocusEvent):void { 
    try { 
    throw new Error('test'); 
    } catch (e:Error) { 
    trace(e.getStackTrace()); 
    } 
} 

堆棧可以解釋爲什麼文本輸入偷了另一個組件的焦點。