我试图弄清楚焦点机制在 Flex 中是如何工作的。这是我的意思的例子:
假设我们有一个简单的 Web 应用程序,其中包含扩展 Canvas
的自定义组件。和实现 mx.managers.IFocusManagerComponent
.此组件覆盖 focusInHandler
和 focusOutHandler
方法并显示有关如何调用它们的一些反馈(更细或更粗的边框)。这个自定义组件还包含一些 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>
这是实时版本(带有源代码 View ):http://rafalrybacki.com/lab/focus_question/ .在应用程序中还有一个
TextArea
下方 Canvas
- 在测试时简化焦点操作。问题:
focusInHandler
),然后如果再次单击,焦点将丢失(调用 focusOutHandler
)- 为什么? Text
Canvas
接收焦点( focusInHandler
调用)并在单击该区域的任何位置时保持它(focusOutHandler
nevet 调用) - 为什么? 也许我对整个焦点问题的理解是错误的? 谢谢你的任何建议。
尊重地,
拉法尔
最佳答案
嘿拉法里巴基。 [我正在开会,不能真正花时间在这个问题上,但我想我可以提供一两个提示:]
首先,Canvas 的目的是与实现 IFocusManagerComponent 的组件不同地与 FocusManager 交互。 Canvas 实现了 IFocusManagerContainer,虽然您可以通过使容器成为 IFocusManagerComponent 来完成您想要完成的任务,但我会避免它,因为我尝试这样做,我认为 flex sdk 团队在使用内部组件时打算这样做。
我认为他们打算让您收听容器中的 FocusEvent。 FocusEvents 默认冒泡,因此您可以使用简单的事件监听器完成您需要的大部分工作。
注意:听 focusOut 可能会混淆具有多个 uicomponents 作为子级的组件 --- 即组合框有一个 UITextField 和一个 Button,因此该组件有多个 FocusOut 和 FocusIn 事件发生在同一组件中。你的救星将(我猜)在一个 focusManger.getFocus() 项目上做一个 container.contains() 来准确地设置你的风格。
我只是胡说八道,所以如果你需要一些帮助,或者想知道更多关于为什么在调度时调度 focusIn 或 focusOut evt - 我很乐意为你拍一些代码并解释为什么要捕获事件类型。您最好的选择(以符合 flex sdk 指南)是在容器内使用事件监听器,而不是与既是 IFocusManagerComponent 又是 IFocusManagerContainer 的组件发生冲突。可能会变得凌乱。
希望有帮助。祝你好运,
杰里米
关于apache-flex - 焦点如何在 Flex 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032144/