通过输入文本过滤JFace ComboViewer

时间:2015-10-19 09:52:09

标签: java filter combobox swt jface

我使用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。

1 个答案:

答案 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;
  }
}