quinta-feira, 17 de março de 2011

p:tabView volta primeira aba

Olá,

O TabView do primefaces volta para a primeira aba em algumas situacoes (quando ele está dentro de um <a4j:outputPanel ajaxRendered="true"> e dentro de um tab tem um rich:datatable e um botão é pressionado no datascroller (nossa, é difícil, mas aconteceu comigo)).

Para resolver isso, simplesmente tire o tabView do outputPanel.

Caso isso não possa ser feito, na troca de aba deve ser setado o 'activeIndex' do tabView. Da seguinte forma:

No tabView deve ser adicionado o tabChangeListener e o activeIndex. E as tabs devem ter seu id setado:

<p:tabView tabChangeListener="#{myBean.onTabChange}" activeIndex="#{myBean.currentTab}">
<p:tab title="primeria aba" id="tab0">
</tab>

<p:tab title="segunda aba" id="tab1">
</tab>

<p:tab title="terceira aba" id="tab2">
</tab>
</p:tabView>


No Bean adicione isso:

private int currentTab = 0;

public int getCurrentTab() {
return currentTab;
}

public void setCurrentTab(int currentTab) {
this.currentTab = currentTab;
}

public void onTabChange(org.primefaces.event.TabChangeEvent event) {
String id = event.getTab().getId();
if (id.equals("tab0")) {
this.setCurrentTab(0);
} else if (id.equals("tab1")) {
this.setCurrentTab(1);
} else if (id.equals("tab2")) {
this.setCurrentTab(2);
}
}


Acredito que isso não funciona no primefaces 2.1.. aqui no 2.2.1 funcionou..

É isso, vaaleu. Abraço.

8 comentários:

  1. Procurei muito na net e encontrei em seu blog... Parabéns e obrigado por compartilhar conhecimento

    ResponderExcluir
  2. tb uso 2.2.1 e essa solução funcionou.
    Mas no 3 não funcionou de jeito algum...

    ResponderExcluir
  3. no 3 não cheguei a testar.. aqui no meu projeto uso o 2.2.1.. teria que dar mais um pesquisada, se encontrar a solução compartilhe aqui por gentileza..
    Abraço
    Adriano Schmidt

    ResponderExcluir
  4. Bom... o poste tem um bom tempinho já, mas para ficar registrado, caso alguém tenha esse problema com a nova versão do primefaces (3.4) deve fazer o seguinte...

    Não existe mais o "tabChangeListener" como propriedade da tabView... Deve-se usar um p:ajax, para ouvir o evento...
    Exemplo:


    //Outros campos da tab

    No resto, é tudo igual...

    ResponderExcluir
  5. Tinha postado o código, mas ele foi excluído.. =/

    ResponderExcluir
  6. acho q o blogspot se perde quando eh postado algo aqui com os sinais de maior e menor...

    ResponderExcluir
  7. olá... to tentando fazer o mesmo no primefaces 3.4.2 e não tá rolando... tem alguma idéia???

    ResponderExcluir
  8. Adriano, bom dia.
    Estava com um problema com tabview, em uma chamada recursiva para uma tela com 3 tabs, onde apenas uma fica ativa todo o tempo, as outras duas possuem o element rendered e são exibidas apenas em momentos específicos.
    Acontece que quando eu mudava para uma tab que não a principal e avançava, a tab que deveria ser exibida fica oculta.
    Estava desde ontem cedo tentando resolver, mas não encontrava uma solução. Hoje, assim que cheguei ao trabalho me deparei com seu post e veio na medida certa.
    Obrigado pelo post (quase cinco anos depois).

    ResponderExcluir