2011-02-17 46 views
5

我試圖弄清楚焦點機制如何在Flex中工作。下面是我的意思的例子:焦點如何在Flex中工作?

假設我們有一個簡單的web應用程序,其中包含自定義組件,該應用程序擴展了Canvas並實現了mx.managers.IFocusManagerComponent。該組件覆蓋focusInHandlerfocusOutHandler方法,並顯示有關如何調用它們的一些反饋(更細或更粗的邊界)。此自定義組件還包含一些Text

組件的源是:

<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width="100" height="100" creationComplete="cc();" implements="mx.managers.IFocusManagerComponent"> 
<mx:Script> 
    <![CDATA[ 
     import mx.containers.Canvas; 
     import mx.controls.Text; 
     import mx.controls.TextArea; 
     import mx.core.UIComponent; 
     import mx.managers.IFocusManagerComponent; 

     public function cc():void 
     { 
      text = new Text; 
      text.text = "123"; 
      addChild(text); 

      setStyle("backgroundColor", "0xddddff"); 
      setStyle("borderColor", "0x000000"); 
      setStyle("borderThickness", 1); 
      setStyle("borderStyle", "solid"); 
     } 

     private var text:Text; 

     override protected function focusInHandler(e:FocusEvent):void { 
      trace("focusInHandler, currFocus: " + focusManager.getFocus()); 
      setStyle("borderThickness", 4); 
     } 

     override protected function focusOutHandler(e:FocusEvent):void { 
      trace("focusOutHandler, currFocus: " + focusManager.getFocus()); 
      setStyle("borderThickness", 1); 
     } 
    ]]> 
</mx:Script> 
</mx:Canvas> 

這裏是實時版本(與源視圖):http://rafalrybacki.com/lab/focus_question/。在應用程序中,Canvas下面還有一個TextArea - 以便在測試時輕鬆進行焦點操作。

的問題:

  1. 如果你的畫布它獲得焦點(focusInHandler被稱爲)在紫羅蘭色點擊一次,然後如果你再次點擊焦點丟失(focusOutHandler叫) - 爲什麼?

  2. 你中點擊一個TextCanvas獲得焦點(focusInHandler調用),並保持它被點擊時,無論在區域(稱爲focusOutHandler nevet) - 爲什麼?

也許我對整個焦點問題的理解是錯誤的? 謝謝你的任何建議。

恕我直言,

拉法爾

回答

1

嘿Rafalrybacki。 [我正在開會,並且不能真正花時間討論這個問題,但認爲我可以幫助一兩個指針:]

首先,Canvas的目的是與FocusManager以不同的組件進行交互實現IFocusManagerComponent。 Canvas實現了IFocusManagerContainer,雖然你可以通過將容器設置爲IFocusManagerComponent來實現你想要完成的任務,但我會避免它,因爲我試圖做到這一點,我認爲flex sdk團隊在使用內部組件時需要這樣做。

我認爲他們打算讓你聽聽容器中的FocusEvent。 FocusEvents默認爲bubble,因此您可以使用簡單的事件偵聽器完成您需要的大部分任務。

注意:聆聽focusOut可能會混淆具有多個子組件的子組件---即組合框具有UITextField和Button,因此該組件具有多個FocusOut和FocusIn事件,而這些事件是在同一個組件中發生的。你的救世主將會(我猜)在focusManger.getFocus()項目(施放它等)上做一個container.contains()來準確設置你的風格。

我只是說blab,所以如果你需要一些幫助,或者想知道更多關於爲什麼focusIn或focusOut evt在調度時被調度 - 我很樂意將一些代碼放在一起爲你解釋爲什麼事件類型被捕獲。你最好的選擇就是在容器中使用一個事件監聽器,而不是與一個既是IFocusManagerComponent又是IFocusManagerContainer的組件進行爭鬥。可能會變得混亂。

希望有所幫助。祝您好運, Jeremy