задайте длинный вопрос, вы получите длинный ответ =)

аюсь реализовать CellTable с пользовательским заголовком столбца, который отображает SearchBox (простое текстовое поле) ниже обычного текста столбца.
SearchBox должен позволять пользователю фильтровать CellTable. Это должно выглядеть примерно так:

  |Header  1|Header 2 |
  |SEARCHBOX|SEARCHBOX|
  -------------------------------------------------------
  |    ROW 1 
  ------------------------------------------------------
  |    ROW 2 

Как только пользователь вводит символ в поле поискаRangeChangeEvent запускается, что приводит к запросам сервера, и CellTable обновляется новым отфильтрованным списком.

В основном все работает отлично. Однако, как только CellTable обновляется, SearchBoxтеряет фокус и пользователь должен снова щелкнуть мышью в поле поиска, чтобы ввести нового символа.

Вероятно, это связано с тем, что метод рендеринга пользовательского заголовка и его ячейки вызывается после обновления CellTable.
Есть ли способ, как установить фокус обратно на SearchBox? Я пытался установитьTabIndex = 0 но это не помогло

Пользовательский класс заголовка
public static class SearchHeader extends Header<SearchTerm> {
    @Override
    public void render(Context context, SafeHtmlBuilder sb) {
        super.render(context, sb);
    }
    private SearchTerm searchTerm;
    public SearchHeader(SearchTerm searchTerm,ValueUpdater<SearchTerm> valueUpdater) {
        super(new SearchCell());
        setUpdater(valueUpdater);
        this.searchTerm = searchTerm;
    }
    @Override
    public SearchTerm getValue() {
        return searchTerm;
    }
 }
Ячейка пользовательского поиска (используется в пользовательском заголовке)

isChanged логический флаг установлен вправда когда пользователь вводит что-то в SearchBox и возвращаетсяложный если SearchBox теряет фокус. Я добавил этот флаг, чтобы различать, какой SearchBox получает фокус (в случае, если я использую несколько SearchBox)

public static class SearchCell extends AbstractCell<SearchTerm> {

    interface Template extends SafeHtmlTemplates {
        @Template("<div style=\"\">{0}</div>")
        SafeHtml header(String columnName);

        @Template("<div style=\"\"><input type=\"text\" value=\"{0}\"/></div>")
        SafeHtml input(String value);
    }

    private static Template template;
    private boolean isChanged = false;

    public SearchCell() {
        super("keydown","keyup","change","blur");
        if (template == null) {
            template = GWT.create(Template.class);
        }
    }

    @Override
    public void render(com.google.gwt.cell.client.Cell.Context context,
        SearchTerm value, SafeHtmlBuilder sb) {
        sb.append(template.header(value.getCriteria().toString()));
        sb.append(template.input(value.getValue()));
    }

    @Override
    public void onBrowserEvent(Context context,Element parent, SearchTerm value,NativeEvent event,ValueUpdater<SearchTerm> valueUpdater) {
        if (value == null)
            return;
        super.onBrowserEvent(context, parent, value, event, valueUpdater);
        if ("keyup".equals(event.getType()))
        {
            isChanged = true;
            InputElement elem = getInputElement(parent);
            value.setValue(elem.getValue());
            if (valueUpdater != null)
                valueUpdater.update(value);
        }
        else if ("blur".equals(event.getType())) {
            isChanged =false;
        }
     }

     protected InputElement getInputElement(Element parent) {
         Element elem = parent.getElementsByTagName("input").getItem(0);
         assert(elem.getClass() == InputElement.class);
         return elem.cast();
     }
}
Код инициализации для CellTable

NameColumn это реализация рефератаколонка класс с соответствующими типами. Он используетTextCell внутренне.

ValueUpdater<SearchTerm> searchUpdater = new ValueUpdater<SearchTerm>() {
    @Override
    public void update(AccessionCellTableColumns.SearchTerm value) {
        // fires a server request to return the new filtered list
        RangeChangeEvent.fire(table, new Range(table.getPageStart(), table.getPageSize())); 
    }
};

table.addColumn(new NameColumn(searchTerm),new SearchHeader(searchTerm,searchUpdater));

Ответы на вопрос(1)

Ваш ответ на вопрос