CellTable con encabezado personalizado que contiene SearchBox y Focus Problem

stoy tratando de implementar CellTable con un encabezado de columna personalizado que muestra un cuadro de búsqueda (cuadro de texto simple) debajo del texto de columna normal.
The SearchBox debería permitir al usuario filtrar CellTable. Debería verse más o menos así:

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

an pronto como el usuario escriba un carácter en el cuadro de búsqueda a RangeChangeEvent se dispara, lo que lleva a solicitudes de un servidor y CellTable se actualiza con la nueva lista filtrada.

Básicamente todo funciona bien. Sin embargo, en cuanto se actualiza CellTable, SearchBox pierde su enfoque y el usuario debe hacer clic con el mouse en SearchBox nuevamente para escribir un nuevo carácter.

Esto probablemente esté relacionado con el hecho de que el método de representación del encabezado personalizado y su celda se llama después de la actualización de CellTable.
¿Hay alguna forma de volver a enfocar el SearchBox? Traté de establecer tabindex = 0 pero no ayudó.

Custom Header Class
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;
    }
 }
Celda de búsqueda personalizada (utilizada en el encabezado personalizado)

Losestá cambiada bandera @ booleana se establece enciert cuando el usuario escribe algo en el cuadro de búsqueda y se vuelve a establecer enfals si SearchBox pierde su foco. Agregué esta bandera para distinguir qué SearchBox obtiene el foco (en caso de que use múltiples SearchBoxes)

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();
     }
}
Init Code para CellTable

NameColumn es la implementación del resumenColumn clase con los tipos apropiados. Utiliza una TextCell internamente.

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));

Respuestas a la pregunta(1)

Su respuesta a la pregunta