apache-flex - 焦点如何在 Flex 中工作?

标签 apache-flex focus

我试图弄清楚焦点机制在 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>

这是实时版本(带有源代码 View ):http://rafalrybacki.com/lab/focus_question/ .在应用程序中还有一个 TextArea下方 Canvas - 在测试时简化焦点操作。

问题:
  • 如果您在紫色 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/

    相关文章:

    apache-flex - 如何使用 ActionScript 获取特定日期的星期几的名称?

    apache-flex - 我可以在没有 Flex builder 的情况下使用 flex 吗?

    WPF - 当应用程序加载时,不要从任何其他应用程序窃取焦点

    apache-flex - 是否可以在 Flex3 网站上使用 Google Adsense?

    regex - 在 Flex 中匹配 not\u0000

    css - 使用 CSS 更改带有嵌套输入字段的字段集的背景颜色

    css - 带有自动对焦的 Webkit 输入不应用 CSS :focus styles

    android - 接下来关注RecyclerView里面的自定义view

    input - 使用 Ionic 2 将焦点设置在输入上

    apache-flex - Flex - crossdomain.xml 请求尝试在 http 端口上使用 https 并超时