我有一个自定义的项目呈现器,它在3个面板中的每个面板中显示5个文本输入:
<?xml version="1.0" encoding="utf-8"?>
<mx:VBox
xmlns:mx="http://www.adobe.com/2006/mxml"
height="300"
width="800"
creationComplete="onCreationComplete()"
>
<!-- code-behind -->
<mx:Script source="ChainListRenderer.mxml.as" />
<mx:Label text="{data.title}" fontSize="25" fontWeight="bold" width="100%" textAlign="center" />
<mx:HBox>
<mx:Panel id="triggerPanel" title="Trigger" width="260">
<mx:VBox id="tpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="trigger1" width="100%" textAlign="left" tabIndex="0" tabEnabled="true" />
<mx:TextInput id="trigger2" width="100%" textAlign="left" tabIndex="1" tabEnabled="true" />
<mx:TextInput id="trigger3" width="100%" textAlign="left" tabIndex="2" tabEnabled="true" />
<mx:TextInput id="trigger4" width="100%" textAlign="left" tabIndex="3" tabEnabled="true" />
<mx:TextInput id="trigger5" width="100%" textAlign="left" tabIndex="4" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
<mx:Panel id="linkPanel" title="Link" width="260">
<mx:VBox id="lpBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="link1" width="100%" textAlign="left" tabIndex="5" tabEnabled="true" />
<mx:TextInput id="link2" width="100%" textAlign="left" tabIndex="6" tabEnabled="true" />
<mx:TextInput id="link3" width="100%" textAlign="left" tabIndex="7" tabEnabled="true" />
<mx:TextInput id="link4" width="100%" textAlign="left" tabIndex="8" tabEnabled="true" />
<mx:TextInput id="link5" width="100%" textAlign="left" tabIndex="9" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
<mx:Panel id="answerPanel" title="Answer" width="260">
<mx:VBox id="apBoxes" width="100%" paddingBottom="5" paddingLeft="5" paddingRight="5" paddingTop="5">
<mx:TextInput id="answer1" width="100%" textAlign="left" tabIndex="10" tabEnabled="true" />
<mx:TextInput id="answer2" width="100%" textAlign="left" tabIndex="11" tabEnabled="true" />
<mx:TextInput id="answer3" width="100%" textAlign="left" tabIndex="12" tabEnabled="true" />
<mx:TextInput id="answer4" width="100%" textAlign="left" tabIndex="13" tabEnabled="true" />
<mx:TextInput id="answer5" width="100%" textAlign="left" tabIndex="14" tabEnabled="true" />
</mx:VBox>
</mx:Panel>
</mx:HBox>
</mx:VBox>
不幸的是,当用作ItemReneller时,文本输入之间的Tab键不起作用,即使使用上面的tabIndex值也是如此。如果我将这段代码复制到它自己的MXML应用程序中,文本输入之间的跳转就会正常工作。
有谁知道在这种情况下如何恢复跳转?如果我不得不在没有这么简单的可用性元素的情况下发布这款应用程序,那将是一种耻辱。
我想我可能需要实现mx.managers.IFocusManagerComponent
,但我找不到任何关于如何做到这一点的例子,而FocusManager docs也没有帮助。
9条答案
按热度按时间hkmswyz61#
我使用mx:vbox作为定制的itemRender,并为我的数据网格设置rendererIsEditor=“true”,而且我还遇到了Tab键顺序的问题。
我得出的结论是,itemRender需要实现IFocusManagerComponent,以便主应用程序的FocusManager()能够正确地跳转到它。我尝试实现该接口:
...结果是做起来相当复杂...要实现很多接口函数。
然而,在我的例子中,我很幸运;我的itemRenender中只有一个TextInput元素(其余的都是定制代码、验证器和格式化程序),所以我将itemRender从mx:vbox转换为mx:TextInput(它已经实现了IFocusManager组件):
瞧啊!我的Tab键顺序问题已修复。
我想对于那些使用更复杂的itemRenderers的人来说,结论是您需要在类中完全实现IFocusManagerComponent接口...这可能很好,因为它看起来将告诉Flex如何通过您的itemRenderer域定制制表符。或者,您可以将顶级标记更改为已经实现该接口的内容,例如:您是否可以将mx:vbox嵌套在如下内容中:
...也许能让它起作用?代码比我复杂的人应该试一试,看看会发生什么。
v09wglhw2#
我在“ListBase派生”组件中使用的itemRender遇到了同样的问题。我发现所有“ListBase派生的”组件都将所有项呈现器 Package 在一个ListBaseContent Holder中。
从ListBase源:
默认情况下,此类的tabChildren和tabEnabled属性设置为FALSE。我能找到的唯一解决办法是创建一个从列表派生的MyList组件,并以这种方式覆盖createChildren方法(其中的listContent被初始化):
然后使用“”而不是“<mx:list/>”组件将ItemRender中的制表符功能带回给我。
希望能有所帮助,
vx6bjr1n3#
我认为我可能正在朝着正确的方向前进,但我还没有完全做到这一点。
我有我的主应用程序,其中HorizontalList使用了一个定制的ItemRender:
我已经更新了原始问题中的代码示例,以包含整个ItemReneller MXML(适用部分);下面是ActionScript代码隐藏:
本质上,我在这里尝试做的是通过在每个文本字段的KEY_DOWN事件上检查TAB键来重新实现跳转,并使用它将焦点移动到下一个TextInput(从最后一个换行到第一个TextInput)。但这并没有达到预期的效果,焦点仍然跳到此HorizontalList之外的下一个控件。
你知道接下来该怎么做吗?
ghg1uchk4#
您为什么要做tabChildren=“False”?您不想给Horzion List的子项添加标签吗?由于项目呈现器是列表的子级...
qij5mzcb5#
用我使用的方法,这似乎是不可能的。我没有使用带有定制条目呈现器的列表,而是切换到单个条目视图组件和单独的列表来显示所有条目的摘要,这让我修复了我的问题。
czfnxgou6#
我也遇到了同样的问题,通过尝试重新实现选项卡按钮的行为来解决它。成功的秘诀就是简单地使用
event.preventdefault()
方法。使用的代码显示在前面。nhn9ugyo7#
我在我的AdvancedDataGrid中遇到了同样的问题(顺便说一句,我正在使用Flex SDK 3.5),但这篇文章对我制作标签友好的itemReneller非常有帮助,所以我也想做点贡献:)
要实现这一点,您还需要更改网格和gridColumn的一些属性。
让我们先来谈谈网格和网格列。
大家都知道,当您将网格的“edable”属性设置为“true”时,您可以在每个列单元格之间使用Tab键(假设没有将列的“edable”属性设置为“False”)。
第1步,将网格的“可编辑”属性设置为“真”
步骤2,使网格的“可编辑”属性也设置为“True”,并将“rendererIsEditor”设置为“True”
将datafield设置为伪字段很重要,因为我们将呈现器设置为编辑器,这意味着您在itemRenator中更新的任何内容都将分配给datafield,即,您将datafield设置为“foo”,其类型为int,并且您有非基元对象填充comboBox itemRender。当您进行选择时,该对象将被分配给“foo”
步骤3,将网格的列“datafield”属性也设置为伪字段。
现在,让我们来做一些事情,使Tab键能够在itemReneller上工作
我知道这不是一个优化的版本,但这将适用于第一次通过。
关于如何在您的itemReneller上使用它的示例:
然后只需将其放入网格列中,就是这样。
好好享受吧。
cunj1qz18#
基本上,您希望删除焦点更改事件的默认行为。我认为你需要这样做:
yyhrrdl89#
这是如何使用ComboBox itemEditor来完成的:
http://blog.flexmonkeypatches.com/2008/02/18/simple-datagrid-combobox-as-item-editor-example/