Apache wicket:来自Linktree.onNodeSelected()的Componenet.replaceWith(组件)

时间:2011-07-20 15:12:12

标签: wicket

我有一个用于导航数据的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上的页面,因此之前存在。我做错了什么?

2 个答案:

答案 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);
        }
  } 
}

我希望这是正确解释的,否则:需要提出问题或意见!