Apache flex 如何根据通过键盘输入的子字符串选择mx:ComboBox的项目
我正在使用Apache flex 如何根据通过键盘输入的子字符串选择mx:ComboBox的项目,apache-flex,flex3,Apache Flex,Flex3,我正在使用,我想根据通过键盘输入的字符串选择一个匹配项。当前,仅基于第一个字符选择第一个匹配项。我想定制这个功能。我找不到执行匹配的KeyboardEvent侦听器,因此我可以覆盖它。要自己执行此操作,您应该查看下面的组合框和列表库类中的代码片段ListBase是组合框组件用于其下拉列表的内容 组合框似乎将键盘输入推迟到下拉列表。然后,它会侦听下拉列表中的事件,以了解选择何时发生了更改(由于键盘或鼠标输入) Flex组件通常重写名为keyDownHandler()的方法,以便在有焦点时处理键盘输
,我想根据通过键盘输入的字符串选择一个匹配项。当前,
仅基于第一个字符选择第一个匹配项。我想定制这个功能。我找不到执行匹配的KeyboardEvent侦听器,因此我可以覆盖它。要自己执行此操作,您应该查看下面的组合框
和列表库
类中的代码片段ListBase
是组合框
组件用于其下拉列表的内容
组合框
似乎将键盘输入推迟到下拉列表。然后,它会侦听下拉列表中的事件,以了解选择何时发生了更改(由于键盘或鼠标输入)
Flex组件通常重写名为keyDownHandler()
的方法,以便在有焦点时处理键盘输入。从那里开始,我们遇到:
现在将执行下拉列表中的keyDownHandler()
。该方法有一个巨大的switch
语句,其中default
case语句如下所示:
default:
{
if (findKey(event.charCode))
event.stopPropagation();
}
这是下拉列表根据键盘输入决定选择内容的地方(当输入不是箭头键或翻页等时)。受保护的findKey()
方法只是调用publicfindString()
方法来完成这项工作
因此,要自己覆盖此行为:
- 扩展
类并用自定义逻辑重写ListBase
或findKey()
方法findString()
- 扩展
类并重写组合框
方法,以便可以实例化自定义的createChildren()
类,而不是默认类ListBase
- 这是我用来让它工作的类
searchStr
是用户输入的字符串,需要匹配。如果没有数据提供程序项与searchStr
匹配,则被重写的侦听器返回默认行为。我正在使用定时器
在2秒后刷新输入的searchStr
。可能的缺点是,它假设数据提供者是字符串
值的集合。但您可以根据需要对其进行相应修改
public class CustomComboBox extends ComboBox
{
private var searchStr:String="";
private var ticker:Timer;
public function CustomComboBox()
{
super();
ticker = new Timer(2000);
ticker.addEventListener(TimerEvent.TIMER, resetSearchString);
}
override protected function keyDownHandler(event:KeyboardEvent):void
{
super.keyDownHandler(event);
// code to search items in the list based on user input.
// Earlier, the default behavior shows the matched items in the dropdown, based on first character only.
// user input is invisible to user.
if((event.charCode>=0x20 && event.charCode<=0x7E) || event.charCode==8) //Range of printable characters is 0x20[space] to 0x7E[~] in ASCII. 8 is ASCII code of [backspace].
{
ticker.reset();
ticker.start();
if(event.charCode==8)
{
if(searchStr=="")
return;
searchStr = searchStr.substr(0, searchStr.length-1);
}
else
{
searchStr += String.fromCharCode(event.charCode);
searchStr = searchStr.toLowerCase();
}
for each(var str:String in dataProvider)
{
if(str.toLowerCase().indexOf(searchStr, 0)>-1)
{
this.selectedItem = dropdown.selectedItem = str;
dropdown.scrollToIndex(dropdown.selectedIndex);
break;
}
}
}
}
/**
* reset the search string and reset the timer.
**/
private function resetSearchString(evt:TimerEvent):void
{
searchStr = "";
ticker.reset();
}
}
公共类CustomComboBox扩展ComboBox
{
private var searchStr:String=“”;
专用var定时器;
公共函数CustomComboBox()
{
超级();
ticker=新定时器(2000);
ticker.addEventListener(TimerEvent.TIMER,resetSearchString);
}
重写受保护的函数keyDownHandler(事件:KeyboardEvent):无效
{
super.keyDownHandler(事件);
//根据用户输入搜索列表中项目的代码。
//前面,默认行为仅基于第一个字符在下拉列表中显示匹配的项。
//用户输入对用户不可见。
if((event.charCode>=0x20&&event.charCode-1)
{
this.selectedItem=dropdown.selectedItem=str;
dropdown.scrollToIndex(dropdown.selectedIndex);
打破
}
}
}
}
/**
*重置搜索字符串并重置计时器。
**/
私有函数resetSearchString(evt:TimerEvent):无效
{
searchStr=“”;
股票代码重置();
}
}
您必须覆盖ComboBox,ComboBox类中将有一个文本字段:IUItextField(类似的内容),您必须将Keylisteners添加到该字段中才能覆盖,有很多库可以执行这种类型的操作,请研究它,因为它涉及大量代码。您是在寻找“提前键入”还是“自动完成”功能性?Flextras MX AutoCompleteComboBox有两个功能:@Zeus请给我一些参考资料。如果有人指导我开发自己的自定义ComboBox
,那将非常有帮助。感谢大家对keyDownHandler()
中发生的事情有深刻的了解。我在这里发布的案例中找到了一个简单的解决方案。
public class CustomComboBox extends ComboBox
{
private var searchStr:String="";
private var ticker:Timer;
public function CustomComboBox()
{
super();
ticker = new Timer(2000);
ticker.addEventListener(TimerEvent.TIMER, resetSearchString);
}
override protected function keyDownHandler(event:KeyboardEvent):void
{
super.keyDownHandler(event);
// code to search items in the list based on user input.
// Earlier, the default behavior shows the matched items in the dropdown, based on first character only.
// user input is invisible to user.
if((event.charCode>=0x20 && event.charCode<=0x7E) || event.charCode==8) //Range of printable characters is 0x20[space] to 0x7E[~] in ASCII. 8 is ASCII code of [backspace].
{
ticker.reset();
ticker.start();
if(event.charCode==8)
{
if(searchStr=="")
return;
searchStr = searchStr.substr(0, searchStr.length-1);
}
else
{
searchStr += String.fromCharCode(event.charCode);
searchStr = searchStr.toLowerCase();
}
for each(var str:String in dataProvider)
{
if(str.toLowerCase().indexOf(searchStr, 0)>-1)
{
this.selectedItem = dropdown.selectedItem = str;
dropdown.scrollToIndex(dropdown.selectedIndex);
break;
}
}
}
}
/**
* reset the search string and reset the timer.
**/
private function resetSearchString(evt:TimerEvent):void
{
searchStr = "";
ticker.reset();
}
}