# onNodeExpand listener in PrimeFaces



## mario87b (19. Dez 2012)

Hallo.

Ich habe ein kleines Problem mit den listener eines Trees erstellt mit PrimesFaces.

Der beschriebenen Code ist direkt übernommen aus dem ShowCase Bereich der PrimeFaces WEbseite, eine entsprechende ManageBEan hab ich erstellt.

Das Ganze funktioniert auch wenn die die ajax Elemente weglassen, sobald ich die listenen hinzufüge, meckert der Compiler bereits das die Methoden onNodeExande, usw. (alle 4), nicht gefunden werden.

Das Ganze läuft dann auch nicht mehr.

Weiß jemand Rat, ich nutze noch PrimeFaces 2.2.1. Die Elemete listener sind aber da schon mit drin.

Danke.


```
<h:form id="form">

    <p:growl id="messages" showDetail="true" />

    <p:tree value="#{treeBean.root}" var="node" dynamic="true" cache="false"
            selectionMode="single"  selection="#{treeBean.selectedNode}" id="tree">

        <p:ajax event="expand" update=":form:messages" listener="#{treeBean.onNodeExpand}" />
        <p:ajax event="collapse" update=":form:messages" listener="#{treeBean.onNodeCollapse}" />
        <p:ajax event="select" update=":form:messages" listener="#{treeBean.onNodeSelect}" />
        <p:ajax event="unselect" update=":form:messages" listener="#{treeBean.onNodeUnselect}" />

        <p:treeNode>
            <h:outputText value="#{node}" />
        </p:treeNode>
    </p:tree>

</h:form>
```


----------



## freez (19. Dez 2012)

Die Fehlermeldungen wären hilfreich. Meist scheitert das an der Methodensignatur. Mir passiert es oft, dass ich ein ActionEvent als Übergabeparameter des Listeners angebe, aber Primefaces will ein NodeExpandEvent oder NodeCollapseEvent. Und somit werden Fehler ala "Finde Methode xy nicht" produziert.


----------



## mario87b (19. Dez 2012)

Hallo.

Die Fehlermeldung des Debuggers bzw. Compilers lautet.

"Unknown property "onNodeExpand"

Kann ich ja auch verstehen, denn onNodeExpand ist ja eine Methode und kein Attribute der ManagedBean. Aber die Beispiel Bean hat das ebenfalls so implementiert - siehe unten.

Führe ich die Anwendung dennoch aus bekomme ich

<p:ajax> Parent not an instance of ClientBehaviorHolder: org.primefaces.component.tree.Tree@1f5ad2b



```
package org.primefaces.examples.view;

import java.io.Serializable;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.primefaces.event.NodeCollapseEvent;
import org.primefaces.event.NodeExpandEvent;
import org.primefaces.event.NodeSelectEvent;
import org.primefaces.event.NodeUnselectEvent;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

public class TreeBean implements Serializable {

	private TreeNode root;

	private TreeNode selectedNode;

	public TreeBean() {
		root = new DefaultTreeNode("Root", null);
		TreeNode node0 = new DefaultTreeNode("Node 0", root);
		TreeNode node1 = new DefaultTreeNode("Node 1", root);
		TreeNode node2 = new DefaultTreeNode("Node 2", root);

		TreeNode node00 = new DefaultTreeNode("Node 0.0", node0);
		TreeNode node01 = new DefaultTreeNode("Node 0.1", node0);

		TreeNode node10 = new DefaultTreeNode("Node 1.0", node1);
		TreeNode node11 = new DefaultTreeNode("Node 1.1", node1);

		TreeNode node000 = new DefaultTreeNode("Node 0.0.0", node00);
		TreeNode node001 = new DefaultTreeNode("Node 0.0.1", node00);
		TreeNode node010 = new DefaultTreeNode("Node 0.1.0", node01);

		TreeNode node100 = new DefaultTreeNode("Node 1.0.0", node10);
	}

	public TreeNode getRoot() {
		return root;
	}

	public TreeNode getSelectedNode() {
		return selectedNode;
	}

	public void setSelectedNode(TreeNode selectedNode) {
		this.selectedNode = selectedNode;
	}

	public void onNodeExpand(NodeExpandEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Expanded", event.getTreeNode().toString());

		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void onNodeCollapse(NodeCollapseEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Collapsed", event.getTreeNode().toString());

		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void onNodeSelect(NodeSelectEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Selected", event.getTreeNode().toString());

		FacesContext.getCurrentInstance().addMessage(null, message);
	}

    public void onNodeUnselect(NodeUnselectEvent event) {
		FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Unselected", event.getTreeNode().toString());

		FacesContext.getCurrentInstance().addMessage(null, message);
	}
}
```


----------



## Templarthelast (19. Dez 2012)

Wie wäre es wenn du die Parameter rausnimmst? Der ajax Tag will auf eine Methode ohne Parameter zugreifen, findet diese aber nicht.


----------



## sence (19. Dez 2012)

Hallo,

gemäß Primefaces 2.2 Dokumentation:

```
<p:tree value="#{treeBean.model}" dynamic="true"
	
nodeSelectListener="#{treeBean.onNodeSelect}"
	
nodeExpandListener="#{treeBean.onNodeExpand}"
	
nodeCollapseListener="#{treeBean.onNodeCollapse}">
	
...
</p:tree>
```

The server side listeners are simple method expressions like;


```
public void onNodeSelect(NodeSelectEvent event) {
	
String node = event.getTreeNode().getData().toString();
	
logger.info("Selected:" + node);
}
	
public void onNodeExpand(NodeExpandEvent event) {
	
String node = event.getTreeNode().getData().toString();
	
logger.info("Expanded:" + node);
}
	
public void onNodeCollapse(NodeCollapseEvent event) {
	
String node = event.getTreeNode().getData().toString();
	
logger.info("Collapsed:" + node);
}
```

in Primefaces 2.2 werden die auszuführenden Listener, als Attribute der Komponente übergeben.
Erst in neueren Primefaces versionen, werden diese als Ajax Event überreicht.

Seite 373
http://primefaces.googlecode.com/files/primefaces_users_guide_2_2.pdf

Grüße


----------

