我使用org.eclipse.jface.viewers.ComboViewer
来显示某些对象的名称。如果我有数百个这样的对象,很难很快找到正确的对象。
默认情况下,ComboViewer仅针对第一个输入的“Letter”进行过滤,但这对我来说不是最佳解决方案,因为我可能拥有名称如下的对象:
"MyObject 1"
"MyObejct 2"
"MyObject 3"
等等。
目前我有这个:
List<MyObject> myObjects = new ArrayList<MyObject>();
myObjects.add(MyObject("One"));
myObjects.add(MyObject("Two"));
myObjects.add(MyObject("ThreeOne"));
myObjects.add(MyObject("ThreeTwo"));
ComboViewer comboViewer = new ComboViewer(parent, SWT.DROP_DOWN | SWT.READ_ONLY);
comboViewer.setContentProvider(ArrayContentProvider.getInstance());
comboViewer.setLabelProider(new LabelProvider(){
@Override
public String getText(final Object element){
if(element instanceof MyObject){
return MyObject.getName();
}
return super.getText(element);
}
comboViewer.setInput(myObjects);
现在我想实现以下目标。
当用户点击“O”时,应在下拉列表中选择MyObject“One”。当他点击“Th”时,应在下拉列表中选择MyObject“ThreeOne”。
输入“ThreeT”时,应选择MyObejct“ThreeTwo”,依此类推。
我希望很清楚我的意思。
我已经尝试org.eclipse.jface.fieldassist.AutoCompleteField
,但并不总是过滤正确的项目。因为MyObject的名称中可能有空格。
自动填充或自动提示的简单文本字段对我来说不是一个选项。我需要这个ComboViewer
如果您需要任何进一步的信息,请告诉我。
编辑: 我现在已经走了很远。
comboViewer.getCombo().addKeyListener(new KeyListener() {
@Override
public void keyPressed(final KeyEvent e) {
}
@Override
public void keyReleased(final KeyEvent e) {
if (e.keyCode == SWT.ESC) {
myFilter.clearSearchString();
} else if (e.keyCode >= 97 && e.keyCode <= 122) {
myFilter.appendToSearchString(e.character);
} else if (e.keyCode >= 48 && e.keyCode <= 57) {
myFilter.appendToSearchString(e.character);
}
comboViewer.refresh();
}
});
我唯一缺少的是:我想在ComboViewer中看到输入的Text。
答案 0 :(得分:0)
您的ComboViewer支持通过setFilters()或addFilter()方法过滤数据。这些方法期望ViewerFilter对象作为参数。
对于每个已注册的ViewerFilter对象,都会调用select()方法。如果应该显示数据,则该方法返回true,如果应该过滤,则返回false。
所以添加过滤器一次。 然后将KeyListener添加到您的 控制更新过滤器并在之后触发viewer.refresh()。
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;
public class PersonFilter extends ViewerFilter {
private String searchString;
public void setSearchText(String s) {
// ensure that the value can be used for matching
this.searchString = ".*" + s + ".*";
}
@Override
public boolean select(Viewer viewer,
Object parentElement,
Object element) {
if (searchString == null || searchString.length() == 0) {
return true;
}
Person p = (Person) element;
if (p.getFirstName().matches(searchString)) {
return true;
}
if (p.getLastName().matches(searchString)) {
return true;
}
return false;
}
}