我有一个用于导航数据的linktree,它将替换另一个div中的一个组件。
对于树中的这个,我有treestatelistener实现
public void nodeSelected(Object node) {
log.debug("nodeSelected: " + node+ " class: " + node.getClass());
Component content = new Label("content");
content.replaceWith(new Label("content", "Hello World"));
}
}
}
我得到的只是信息:
“此方法只能在已经存在的组件上调用 添加到其父母。“
具有Id“内容”的标签被添加到init上的页面,因此之前存在。我做错了什么?
答案 0 :(得分:3)
每次调用treenode侦听器时,您都在创建新的父组件,而不添加“内容”标签。 我建议尝试这样的事情 -
public MyPage extends WebPage {
private Component parent = new WebMarkupContainer("parent");
public WebPage() {
parent.add(new Label("content", "hi");
}
...
public void nodeSelected(Object node) {
log.debug("nodeSelected: " + node+ " class: " + node.getClass());
parent.replaceWith(new Label("content", "Hello World"));
}
}
}
答案 1 :(得分:0)
我总是遇到只调用Component.replaceWith()的问题。由于我使用AJAX进行此操作,因此我总是需要调用target.add()。
我现在的解决方案是让MyTree类扩展LinkTree,并在该类中覆盖newNodeComponent()。
因为在我的应用程序中一切都发生在IndexPage.class上,我只是替换组件,我在IndexPage.Class中添加了一个方法handleSelection()(扩展了BasePage扩展的网页)。在那里,我根据点击的nodeObject决定如何替换IndexPage中的组件
Public Class MyTree extends Linktree{
protected Component newNodeComponent(String id, IModel<Object> model) {
@Override
protected void onNodeLinkClicked(Object node, BaseTree tree, AjaxRequestTarget target) {
super.onNodeLinkClicked(node, tree, target);
((IndexPage)getPage()).handleSelection(target, (TreeNode)node);
}
@Override
protected ResourceReference getResourceFolderOpen(Object node) {
return getResourceForNode(node);
}
@Override
protected ResourceReference getResourceFolderClosed(Object node) {
return getResourceForNode(node);
}
@Override
protected ResourceReference getResourceItemLeaf(Object node) {
return super.getResourceItemLeaf(node);
}
@Override
protected ResourceReference getImageResourceReference(BaseTree tree, Object node) {
return getResourceForNode(node);
}
}
}
我希望这是正确解释的,否则:需要提出问题或意见!