【问题标题】:Filter JFace ComboViewer by entering text通过输入文本过滤 JFace ComboViewer
【发布时间】:2015-10-19 09:52:08
【问题描述】:

我使用org.eclipse.jface.viewers.ComboViewer 来显示某些对象的名称。如果我喜欢数百个这样的对象,那么很快就很难找到合适的对象。 默认情况下,ComboViewer 仅过滤第一个输入的“字母”,但这对我来说不是最佳解决方案,因为我可能有名称如下的对象:

"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 的某处看到输入的文本。

【问题讨论】:

    标签: java filter combobox swt jface


    【解决方案1】:

    您的 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;
      }
    } 
    

    【讨论】:

    猜你喜欢
    • 2018-01-08
    • 2016-09-27
    • 2015-07-14
    • 2017-04-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多