Grid.reconfigure () do GXT bagunça o alinhamento do cabeçalho

Como adicionamos um novo recurso ao nosso aplicativo que precisava da capacidade de ocultar / mostrar uma coluna específica em uma grade GXT, um bug foi encontrado. O cabeçalho da coluna não foi alinhado com as linhas abaixo quando uma coluna foi ocultada / mostrada programaticamente. Não surpreendentemente, foi a chamada grid.reconfigure (…) que causou o bug.

Assinatura de Grid.reconfigure ():

void reconfigure(ListStore<M> store, ColumnModel cm)

Estamos usando MVP e Gin em nosso código do lado do cliente e nosso apresentador tem um método de início semelhante a este:

void start(final AcceptsOneWidget panel, final EventBus eventBus) {
//Figure out which columns to show/hide
...

display
.setColumnVisibility(...);
panel
.setWidget(getDisplay().asWidget());
}

Nossas instâncias de exibição são mantidas como singleton por Gin para evitar ter que recriá-las toda vez que um lugar é visitado. O bug só apareceu quando a grade já havia sido renderizada. Portanto, parece que grid.reconfigure (…) é dependente de que o widget está anexado ao DOM (GXT provavelmente faz cálculos de tamanho dependentes do DOM) ou que widget.layout () não foi executado. O método de reconfiguração não indica se é ou não o caso, mas parece-me que sim.

Então, como você evita essa situação?

Bem, ou você tem a certeza de sempre esperar (pelos ouvintes ou não) que a grade seja renderizada ou você o faz em um nível superior.
Eu resolvi isso da última maneira. No método start (…) na classe do apresentador, certifico-me de que o Display esteja anexado ao DOM antes de qualquer outra chamada que possa modificar as colunas da grade.
Depois da minha mudança, é assim que o método start () em um Presenter se parece:

public void start(final AcceptsOneWidget panel, final EventBus eventBus) {
//Figure out which columns to show/hide
...

panel
.setWidget(getDisplay().asWidget());
display
.setColumnVisibility(...);
}

Para resumir, eu troquei a ordem das duas chamadas no método start na classe Presenter.