2011-02-17 73 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