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

8 respostas
M

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:

@SessionScoped
@ManagedBean
public class TabViewController
{
	private List<TabItem> 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;
		}
	}
}

Alguém pode me ajudar?

8 Respostas

H

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

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

M

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?

H

Eita ferro. =/

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

M

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:

M

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

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

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.

B

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

W
tenta pegar assim

TabItem tabItem = (TabItem)event.getData();

System.out.println(tabItem.getName());

hehehehe funciona! ^^

A

eu consegui fazer desta forma

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


    }
Criado 23 de janeiro de 2012
Ultima resposta 18 de jul. de 2012
Respostas 8
Participantes 5