如何以编程方式将焦点设置为Horizo​​ntalList,以便它可以接收键事件(Flex)?

时间:2009-10-26 14:47:30

标签: flex focus setfocus

请看代码:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:creationComplete>
    <![CDATA[
        list.setFocus();
    ]]>
</mx:creationComplete>
<mx:HorizontalList id="list">
    <mx:creationComplete>
        <![CDATA[
            setFocus();
        ]]>
    </mx:creationComplete>
    <mx:focusIn>
        <![CDATA[
            trace("Received focus");
        ]]>
    </mx:focusIn>
    <mx:keyDown>
        <![CDATA[
            trace("Key down");
        ]]>
    </mx:keyDown>
    <mx:dataProvider>
        <mx:Object label="Some"/>
        <mx:Object label="Different"/>
        <mx:Object label="Stuff"/>
    </mx:dataProvider>
</mx:HorizontalList>

如您所见,我尝试在加载应用程序时使HorizontalList集中注意力。我实际上在控制台中收到Received focus消息。但我希望在设置焦点后我可以使用箭头键在列表元素上导航。但事实并非如此。它们仅在使用鼠标单击组件后才起作用。那么,我做错了什么?如何使列表具有焦点并响应箭头键?

2 个答案:

答案 0 :(得分:4)

您的应用是否在浏览器中运行?您可能必须将注意力设置在SWF对象上(通过JavaScript),以便开始与之交互而无需先单击对象。

例如,假设您正在使用Flex Builder,请尝试在index.template.html文件的SCRIPT标记的末尾添加如此行:

window.onload = function()
{
    document.getElementById("${application}").focus();
};

您可能需要根据具体情况做一些调整,但这可能是问题所在。明确地将注意力集中在Flash对象上应该可以解决问题。希望它有所帮助!

答案 1 :(得分:2)

我运行了您的代码,并且能够使用键盘在列表中导航而不先点击列表 - 但我必须点击Flex应用中的某个地方以便它首先得到了关注。我认为这是闪存的一般限制 - 除非你点击它上面的某个地方,否则SWF将不会获得键盘焦点(尽管mouseOver仍会被触发)。