ApacheWicket:Linktree.onNodeSelected()中的Componenet.replaceWith(组件)

ApacheWicket:Linktree.onNodeSelected()中的Componenet.replaceWith(组件),wicket,Wicket,我有一个链接树用于数据导航,它将替换另一个div中的组件 为此,我在树中实现了treestatelistener public void nodeSelected(Object node) { log.debug("nodeSelected: " + node+ " class: " + node.getClass()); Component content = new Label("content"); content.replaceWi

我有一个链接树用于数据导航,它将替换另一个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为“content”的标签被添加到init上的页面中,因此它在前面。我做错了什么?

每次调用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"));
    }
  }
}

每次调用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"));
    }
  }
}

我总是在调用Component.replaceWith()时遇到问题。因为我是用AJAX来实现这一点的,所以我总是需要调用target.add()

目前我的解决方案是让一个类MyTree扩展LinkTree,并在该类中重写newNodeComponent()

因为在我的应用程序中,所有事情都发生在IndexPage.class上,而我只是在那里替换组件,所以我向IndexPage.class(extends BasePage extends webpage)添加了一个handleSelection()方法。在那里,我根据单击的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);
        }
  } 
}
公共类MyTree扩展了Linktree{
受保护组件newNodeComponent(字符串id,IModel模型){
@凌驾
已单击受保护的void onNodeLink(对象节点、BaseTree树、AjaxRequestTarget目标){
super.onNodeLinkClicked(节点、树、目标);
((IndexPage)getPage()).handleSelection(目标,(TreeNode)节点);
}
@凌驾
受保护的ResourceReference getResourceFolderOpen(对象节点){
返回getResourceForNode(节点);
}
@凌驾
受保护的ResourceReference getResourceFolderClosed(对象节点){
返回getResourceForNode(节点);
}
@凌驾
受保护的ResourceReference getResourceItemLeaf(对象节点){
返回super.getResourceItemLeaf(节点);
}
@凌驾
受保护的ResourceReference getImageResourceReference(BaseTree树,对象节点){
返回getResourceForNode(节点);
}
} 
}

我希望这是适当的解释,否则:需要问题或评论

我总是在调用Component.replaceWith()时遇到问题。因为我是用AJAX来实现这一点的,所以我总是需要调用target.add()

目前我的解决方案是让一个类MyTree扩展LinkTree,并在该类中重写newNodeComponent()

因为在我的应用程序中,所有事情都发生在IndexPage.class上,而我只是在那里替换组件,所以我向IndexPage.class(extends BasePage extends webpage)添加了一个handleSelection()方法。在那里,我根据单击的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);
        }
  } 
}
公共类MyTree扩展了Linktree{
受保护组件newNodeComponent(字符串id,IModel模型){
@凌驾
已单击受保护的void onNodeLink(对象节点、BaseTree树、AjaxRequestTarget目标){
super.onNodeLinkClicked(节点、树、目标);
((IndexPage)getPage()).handleSelection(目标,(TreeNode)节点);
}
@凌驾
受保护的ResourceReference getResourceFolderOpen(对象节点){
返回getResourceForNode(节点);
}
@凌驾
受保护的ResourceReference getResourceFolderClosed(对象节点){
返回getResourceForNode(节点);
}
@凌驾
受保护的ResourceReference getResourceItemLeaf(对象节点){
返回super.getResourceItemLeaf(节点);
}
@凌驾
受保护的ResourceReference getImageResourceReference(BaseTree树,对象节点){
返回getResourceForNode(节点);
}
} 
}

我希望这是适当的解释,否则:需要问题或评论

Hm.那个节点是从哪里选来的?关于调用replaceWith的行:“替换组件必须与它将替换的组件具有相同的id”,据我所见,应该在构造函数中初始化的新标签上调用replaceWith函数。我还记得,在您调用replace之后,您必须执行以下操作:originalLabel=newLabel。不管怎样,我使用的是Wicket 6.20,只是为了确保我们讨论的是相同的情况。:)Hm.那个节点是从哪里选来的?关于调用replaceWith的行:“替换组件必须与它将替换的组件具有相同的id”,据我所见,应该在构造函数中初始化的新标签上调用replaceWith函数。我还记得,在您调用replace之后,您必须执行以下操作:originalLabel=newLabel。不管怎样,我使用的是Wicket 6.20,只是为了确保我们讨论的是相同的情况。:)