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()
方法只是调用public
findString()
方法来完成这项工作

因此,要自己覆盖此行为:

  • 扩展
    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();
              }
          }