1

我尝试让 GXT 组合框(3.0.1)接受我在其中输入的文本,但它会在模糊时不断删除它。难道不能告诉组合框接受一个不属于其 liststore 的值吗?

PS: setForceSelection(false) 没有做我想要的:)

4

1 回答 1

2

评论中提到的错误集中在ComboBox<String>,因为从用户输入的数据(又名字符串)到组合中的数据(也是字符串)之间存在自然映射。如果您没有这样的自然映射,那么最新版本对您没有多大帮助——也就是说,您仍然可以这样做。

ComboBox 使用 PropertyEditor 来呈现数据,在解析数据时在存储中查找并返回一个值,还可以将任意数据转换为 T 值。它委托 toComboBoxCell.selectByValue(String)寻找匹配的值。

应该可以覆盖该方法并提供新行为,或者PropertyEditor<T>根据 ComboBox 中的内置方法进行自定义,如果找不到,它将根据您的规则创建新对象。可能是这样的:

ComboBox<MyObject> combo = new ComboBox<MyObject>(new ComboBoxCell<MyObject>(store, labelProvider){
  @Override
  protected MyObject selectByValue(String value) {
    MyObject val = super.selectByValue(value);
    if (val == null) {
      // custom logic for creating new objects goes here
      val = new MyObject();
      val.setDisplayName(value);
    }
    return val;
  }
});

如果您最终经常这样做,请考虑以一种方式将其分解,以便您可以将委托交给负责从字符串中生成自定义对象的组合框。


原始答案,重点是ComboBox<String>

除了评论中提到的错误报告之外,还有另一个涉及相同问题的错误(可能也应该关闭)-http ://www.sencha.com/forum/showthread.php? 196281-GXT-3- rc2-ComboBox-setForceSelection%28false%29-does-not-work/page2。这不仅讨论了错误本身,以及为什么它是一个问题,而且还讨论了使用 PropertyEditor 获取其他可能不存在的值的可能实现 - 您应该能够对其进行调整以使其更具体你的情况。

我在该线程中的笔记(复制到此处以避免链接死机):

将其设为ComboBox<String>, 而不是试图告诉ComboBox新字符串仅仅是不是错误,PropertyEditor<String>而是给它一个自定义。a 的目的PropertyEditor(名称是 2.x 的保留,在有诸如编辑器框架之类的东西之前)是将用户输入的文本转换为可以从代码中使用的值,反之亦然 - 如何将模型对象中的值打印到屏幕上的文本中。

(实际上是)的默认值PropertyEditor是-它使用受保护的方法来尝试找出存储中的哪个值与当前字符串匹配。ComboBoxComboBoxCellComboPropertyEditorT selectByValue(String)

如果,正如我所说,您想支持任何字符串值,这是向 Store 添加值(如果它适合)的好方法,或者只是说“是的,该字符串是字符串,字符串是值” - 不需要针对商店中的每个值进行测试。

也就是说,是的,我们当前在 clearValueOnParseError=false 上的行为显然没有意义,鉴于 2.x 和 3 之间的差异,forceSelection 很可能没有意义。我目前专注于我们如何能够使 clearValueOnParseError 工作 - 并试图确保它足以满足 forceSelection 行为。

于 2013-06-17T19:28:03.723 回答