我尝试让GXT组合框(3.0.1)接受我输入的文字,但它会在模糊时不断删除它。是不是可以告诉组合框接受一个不属于其列表库的值?
PS:setForceSelection(false)没有做我想要的事情:))
答案 0 :(得分:2)
评论中提到的错误集中在ComboBox<String>
,因为从用户输入的数据(也称为字符串)到组合中的数据(也是字符串)存在自然映射。如果你没有这样的自然映射,那么最新版本对你没有多大帮助 - 也就是说,你仍然可以做到这一点。
ComboBox使用PropertyEditor来呈现数据,在解析数据时查找并返回商店中的值,还可以将任意数据转换为T值。它委托ComboBoxCell.selectByValue(String)
找到匹配的值。
应该可以覆盖该方法并提供新行为,或者根据ComboBox中的内置函数创建自定义PropertyEditor<T>
,如果找不到任何内容,将根据您的规则创建新对象。也许是这样的事情:
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>
。PropertyEditor
的目的(名称是来自2.x的保留,在编辑框架之类的东西之前)是将用户输入的文本转换为可以从代码中使用的值,并且反之亦然 - 如何将模型对象中的值打印到屏幕上的文本中。
PropertyEditor
的默认ComboBox
(实际上是ComboBoxCell
)是ComboPropertyEditor
- 它使用受保护的方法T selectByValue(String)
来尝试找出什么值在商店中匹配当前字符串。正如我所说,如果你想支持任何字符串值,这是一个很好的方法,如果它适合,可以向Store添加一个值,或者只是说'是的,该字符串是一个字符串,字符串是值' - 无需针对商店中的每个价值进行测试。
那说,是的,我们当前对clearValueOnParseError = false的行为显然没有意义,并且鉴于2.x和3之间的差异,很可能forceSelection没有意义。我目前正专注于我们如何使clearValueOnParseError工作 - 并尝试确保它足以满足forceSelection行为。