Primefaces Tabview: Título da tab está retornando vazio ""

Bom dia pessoal,

Estou com uma dificuldade para descobrir o seguinte problema.
Quando eu vou fechar uma tab, esse dispara um evento e esse evento.getTab().getTitle() retorna vazio “”.

Segue o meu código:

<p:tabView value="#{tabViewController.tabList}"
				activeIndex="#{tabViewController.activeIndex}" var="tabItem"
				dynamic="true" closeable="true">
				
				<p:ajax event="tabClose" listener="#{tabViewController.onTabClose}"/>
				<p:ajax event="tabChange" listener="#{tabViewController.onTabChange}"/>
				
				<p:tab title="#{tabItem.name}" closable="true">								
				</p:tab>
			</p:tabView>

Na tabview aparece o título da tab, mas quando tento pegar o título da tab pelo evento para poder remover da minha lista, esse aparece vazio.

Segue o mb:

[code]@SessionScoped
@ManagedBean
public class TabViewController
{
private List tabList;
private int activeIndex = 0;

public TabViewController()
{
	tabList = new ArrayList<TabItem>();

	tabList.add(new TabItem("tab1", "teste.xhtml", 0));
	tabList.add(new TabItem("tab2", "teste.xhtml", 1));
}

public void addTab()
{
	int newActiveIndex = tabList.size();

	this.tabList.add(new TabItem("tab" + (newActiveIndex + 1), "teste.xhtml", newActiveIndex));
	//define activeIndex com -1 porque inicia em 0
	this.setActiveIndex(newActiveIndex);
}

public List<TabItem> getTabList()
{
	return tabList;
}

public void setTabList(List<TabItem> tabList)
{
	this.tabList = tabList;
}

public int getActiveIndex()
{
	return activeIndex;
}

public void setActiveIndex(int activeIndex)
{
	this.activeIndex = activeIndex;
}

public void onTabClose(TabCloseEvent event)
{
	System.out.println(event.getTab().getTitle());
}

public void onTabChange(TabChangeEvent event)
{
	System.out.println(event.getTab().getTitle());
}

public class TabItem
{
	private String name;
	private String url;
	private int tabIndex;

	//TODO assim que necessário colocar mais atributos nessa tab

	public TabItem(String name, String url, int tabIndex)
	{
		this.setName(name);
		this.setUrl(url);
		this.setTabIndex(tabIndex);
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getUrl()
	{
		return url;
	}

	public void setUrl(String url)
	{
		this.url = url;
	}

	public int getTabIndex()
	{
		return tabIndex;
	}
	
	public void setTabIndex(int tabIndex)
	{
		this.tabIndex = tabIndex;
	}
}

}[/code]

Alguém pode me ajudar?

E se você colocar <p:ajax event=“tabClose” listener="#{tabViewController.onTabClose}"/> dentro da tab?

Não sei se funciona, apenas um teste. [=

realizei esse teste e lançou a seguinte exceção:

javax.servlet.ServletException: /home.xhtml @58,74 <p:ajax> Parent not an instance of ClientBehaviorHolder: org.primefaces.component.tabview.Tab@770ad419

Terias alguma outra ideia?

Eita ferro. =/

Veja se a chamada #{tabItem.name} está realmente trazendo valor.

Quando o TabController é instanciado ou quando uma nova Tab é inserida no componente TabView ele executa normalmente, passando pelos gets.
O title da tab é setada pois aparece em tela na tabview.

O problema só ocorre quando tento acessar os valores da Tab através do evento. :confused:

Bom… depois de muito tentar resolver da forma adequada, encontrei um forma provisória.

[code]private int getIndexFromCurrentTab()
{
ExternalContext external = FacesContext.getCurrentInstance().getExternalContext();
Map<String, String> requestMap = external.getRequestParameterMap();

	//procura entre todos os parâmetros o tabIndex da tab corrente
	for (String code : requestMap.keySet())
	{
		if (code.contains("tabindex"))
			return Integer.parseInt(requestMap.get(code));
	}
	
	return -1;
}[/code]

No momento que houver o evento na tab é só executar esse método que ele retorna a tab corrente.
Não considero esse tópico finalizado, pois imagino que exista uma saída muito melhor.

Tenta utilizar um process="@form" no p:ajax.

tenta pegar assim
TabItem tabItem = (TabItem)event.getData();
System.out.println(tabItem.getName());

hehehehe funciona! ^^

eu consegui fazer desta forma

[code]public void onTabChange(TabCloseEvent event) {
TabView tb = (TabView) event.getComponent();
FacesMessage msg = new FacesMessage(“Tab Fechada”, "Fechada Tab: " + tb.getActiveIndex());
FacesContext.getCurrentInstance().addMessage(null, msg);
aba.remove(tb.getActiveIndex());
cont–;

}[/code]