Apache flex focus在Flex中是如何工作的?
我试图弄清楚焦点机制在Flex中是如何工作的。下面是我的意思的例子: 假设我们有一个简单的web应用程序,它包含扩展Apache flex focus在Flex中是如何工作的?,apache-flex,focus,Apache Flex,Focus,我试图弄清楚焦点机制在Flex中是如何工作的。下面是我的意思的例子: 假设我们有一个简单的web应用程序,它包含扩展Canvas并实现mx.managers.ifocusmanager组件的自定义组件。此组件覆盖focusInHandler和focusOutHandler方法,并显示有关如何调用它们的一些反馈(较薄或较厚的边框)。此自定义组件还包含一些文本 组件的来源是: <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" width=
Canvas
并实现mx.managers.ifocusmanager组件的自定义组件。此组件覆盖focusInHandler
和focusOutHandler
方法,并显示有关如何调用它们的一些反馈(较薄或较厚的边框)。此自定义组件还包含一些文本
组件的来源是:
<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>
以下是实时版本(带源代码视图):。在应用程序中,在画布下方还有一个文本区域
,用于在测试时简化焦点操作
问题:
如果在紫色画布上单击一次,它会收到焦点(focusInHandler
被调用),如果再次单击,焦点会丢失(focusOutHandler
被调用)为什么?
如果您单击文本
,画布
接收焦点(focusInHandler
调用),并在单击区域的任何位置时保持焦点(focusOutHandler
nevet调用)为什么?
也许我对焦点问题的理解是错误的谢谢您的建议。
恕我直言
拉法嘿,拉法里巴基。[我正在开会,不能真正花时间讨论这个问题,但我想我可以用一两个指针来帮助:]
首先,画布的目的是与FocusManager进行交互,这与实现IfocusManager组件的组件不同。Canvas实现了IFocusManagerContainer,虽然您可以通过使容器成为IFocusManagerComponent来完成您想要完成的任务,但我会避免它,因为我尝试这样做,我认为flex sdk团队在使用内部组件时希望这样做
我认为他们的目的是让你听你容器中的FocusEvent。默认情况下,FocusEvents冒泡,因此您可以通过一个简单的事件侦听器完成所需的大部分工作
注意:侦听focusOut可能会与具有多个uicomponents作为子组件的组件混淆,即combobox具有一个UITextField和一个按钮,因此该组件具有多个focusOut和FocusIn事件,这些事件发生在同一组件中。您的救世主(我猜)将在focusManger.getFocus()项上执行container.contains()来精确设置您的样式
我只是说说而已,所以如果你需要更多的帮助,或者想知道为什么focusIn或focusOut evt在被调度时会被调度——我很乐意为你编写一些代码,并解释为什么会捕获这种类型的事件。您的最佳选择(符合flex sdk指南)是从容器中使用事件侦听器,而不是同时使用IfocusManager组件和IfocusManager容器的组件。可能会弄得一团糟
希望有帮助。祝你好运,
杰里米