Tree Node ClassCastException
zjda Jan 28, 2009 2:21 PMHi, I used rich:recursiveTreeNodesAdaptor for my tree. However, I could not figure how to refresh the affected nodes since addComponentToAjaxRender method caused exceptions due to no row key.
Therefore, I create my class ObjectBeanNode:
public class ObjectBeanNode implements TreeNode<ObjectBean> {
private static final long serialVersionUID = -5498990493803705085L;
private ObjectBean data = null;
private TreeNode<ObjectBean> parent = null;
private Map<Object, TreeNode<ObjectBean>> childrenMap = null;
public ObjectBeanNode(ObjectBean data) {
this.data = data;
}
public ObjectBeanNode(ObjectBean data, TreeNode<ObjectBean> parent) {
this.data = data;
this.parent = parent;
}
public ObjectBean getData() {
return data;
}
public TreeNode<ObjectBean> getChild(Object identifier) {
if (this.childrenMap == null) {
this.loadChildren();
}
return childrenMap.get(identifier);
}
public void addChild(Object identifier, TreeNode<ObjectBean> child) {
if (this.childrenMap == null) {
this.loadChildren();
}
child.setParent(this);
childrenMap.put(identifier, child);
}
public void removeChild(Object identifier) {
if (this.childrenMap == null) {
this.loadChildren();
}
TreeNode<ObjectBean> treeNode = (TreeNode<ObjectBean>) childrenMap.remove(identifier);
if (treeNode != null) {
treeNode.setParent(null);
}
}
public void setData(ObjectBean data) {
this.data = data;
}
public TreeNode<ObjectBean> getParent() {
return parent;
}
public void setParent(TreeNode<ObjectBean> parent) {
this.parent = parent;
}
public boolean isLeaf() {
return !this.data.isCollectable();
}
@Override
public Iterator<Entry<Object, TreeNode<ObjectBean>>> getChildren() {
if (this.childrenMap == null) {
this.loadChildren();
}
return this.childrenMap.entrySet().iterator();
}
public String getType() {
return this.data.isCollectable() ? "node" : "item";
}
private void loadChildren() {
try {
this.childrenMap = new LinkedHashMap<Object, TreeNode<ObjectBean>>();
...
} catch (ApiException e) {
e.printStackTrace();
}
}
and use rich:tree as the following:
<rich:tree id="navtree" value="#{navTree.root}" treeNodeVar="treeNode"
var="item" switchType="ajax" reRender="mainFrame" ajaxSubmitSelection="true"
nodeFace="#{treeNode.type}" dropListener="#{navTree.dropListener}">
<rich:treeNode type="node" acceptedTypes="mitarbeiter" dropValue="#{treeNode}">
<h:outputText value="#{item.name}" />
</rich:treeNode>
<rich:treeNode type="item" dragType="mitarbeiter" dragValue="#{treeNode}">
<rich:dndParam name="label" type="drag">#{item}</rich:dndParam>
<h:outputText value="#{item.name}" style="color:blue"/>
</rich:treeNode>
</rich:tree>
But, I get the exception:
java.lang.ClassCastException: ObjectBeanNode cannot be cast to javax.swing.tree.TreeNode org.richfaces.model.SwingTreeDataModel.setWrappedData(SwingTreeDataModel.java:66)
org.richfaces.component.UITree.createDataModel(UITree.java:692) org.ajax4jsf.component.UIDataAdaptor.getExtendedDataModel(UIDataAdaptor.java:621)
...
If I use the class in the Richface demo, the tree works fine. Could anyone tell me what causes the problem.
Thanks,
-ZJ