从Wicket中的不同面板更新面板

从Wicket中的不同面板更新面板,wicket,Wicket,在Wicket中,我有一个包含两个面板的站点: <body> <wicket:panel> <div wicket:id="menu"></div> <div wicket:id="content"></div> </wicket:panel> </body> 如您所见,每个链接都添加了一个AjaxEventBehavior。我的问题是现在我无法访问内

在Wicket中,我有一个包含两个
面板的站点:

<body>
    <wicket:panel>
        <div wicket:id="menu"></div>
        <div wicket:id="content"></div>
    </wicket:panel>
</body>
如您所见,每个
链接都添加了一个
AjaxEventBehavior
。我的问题是现在我无法访问
内容面板
来更新其内容。 所以我要找的是这样的东西:

 // inside menuPanel.java
 @Override
protected void populateItem(ListItem<Link> link) {
    final WebMarkupContainer categoryMenuItemLink = new WebMarkupContainer("categoryMenuItemLink");
    link.add(categoryMenuItemLink);
    link.add(new AjaxEventBehavior("click") {
        private static final long serialVersionUID = 1L;

        @Override
        protected void onEvent(AjaxRequestTarget target) {
            System.out.println("Ajax works");
            //Panel p = getPanel("content);
            //p.update(newContent);
            //target.add(p);
        }
    });
}
//在menuPanel.java内部
@凌驾
受保护的void populateItem(列表项链接){
最终WebMarkupContainer categoryMenuItemLink=新WebMarkupContainer(“categoryMenuItemLink”);
link.add(categoryMenuItemLink);
添加(新的AjaxEventBehavior(“单击”){
私有静态最终长serialVersionUID=1L;
@凌驾
受保护的void onEvent(AjaxRequestTarget目标){
System.out.println(“Ajax工作”);
//Panel p=getPanel(“内容”);
//p、 更新(新内容);
//增加(p);
}
});
}
每个
面板
位于不同的
类中

  • menuPanel.java
  • contentPanel.java

在事件处理程序中,您可以使用
findParent(OuterPanel.class)
其中OuterPanel.class是您在问题开头描述的面板(即包含菜单和内容面板的面板)。
一旦有了它,您就可以在事件处理程序中使用
outerPanel.get(“content”)

获取内容面板,您可以使用
findParent(outerPanel.class)
其中outerPanel.class是您在问题开头描述的面板(即包含菜单和内容面板的面板)。
一旦您拥有了它,您就可以使用
outerPanel.get(“content”)

获取内容面板,您可以将面板抽象化并定义抽象方法:

abstract Panel getContentPanel();
Panel contentPanel = new ConentPanel();
Panel menuPanel = new MenuPanel() {
    @Override
    Panel getContentPanel() {
        return contentPanel;
    }
}
当您在页面上添加面板时,您需要实现abtsract方法:

abstract Panel getContentPanel();
Panel contentPanel = new ConentPanel();
Panel menuPanel = new MenuPanel() {
    @Override
    Panel getContentPanel() {
        return contentPanel;
    }
}

现在,在事件中,您可以获取contentPanel

您可以将面板抽象化并定义抽象方法:

abstract Panel getContentPanel();
Panel contentPanel = new ConentPanel();
Panel menuPanel = new MenuPanel() {
    @Override
    Panel getContentPanel() {
        return contentPanel;
    }
}
当您在页面上添加面板时,您需要实现abtsract方法:

abstract Panel getContentPanel();
Panel contentPanel = new ConentPanel();
Panel menuPanel = new MenuPanel() {
    @Override
    Panel getContentPanel() {
        return contentPanel;
    }
}

现在在事件中,您可以获得contentPanel,正如soorapadman评论的那样,您应该使用事件解决您的问题,以保持组件之间的分离(测试、可重用性等)。 在Wicket中,您可以找到一个简短的示例。我借用了他们的示例以适应您的问题:

事件的“有效负载”,在本例中是一个简单的包装类,带有一个AjaxRequest来帮助我们更新内容

    public class ContentUpdate {
        private final AjaxRequestTarget target;

        public CounterUpdate(AjaxRequestTarget target) {
            this.target = target;
        }

        public AjaxRequestTarget getTarget() {
            return target;
        }
    }
还有你的menuPanel课程

//inside menuPanel.java
@Override
protected void populateItem(ListItem<Link> link) {
  final WebMarkupContainer categoryMenuItemLink = new 
  WebMarkupContainer("categoryMenuItemLink");
  link.add(categoryMenuItemLink);
  link.add(new AjaxEventBehavior("click") {          

      @Override
      protected void onEvent(AjaxRequestTarget target) {
          send(getPage(), Broadcast.BREADTH, new ContentUpdate(target));
      }
   });
}
//在menuPanel.java内部
@凌驾
受保护的void populateItem(列表项链接){
最终WebMarkupContainer CategoryNuItemLink=新建
WebMarkupContainer(“categoryMenuItemLink”);
link.add(categoryMenuItemLink);
添加(新的AjaxEventBehavior(“单击”){
@凌驾
受保护的void onEvent(AjaxRequestTarget目标){
发送(getPage(),Broadcast.width,newcontentupdate(目标));
}
});
}
您的内容面板现在应该覆盖OneEvent方法以接收事件“消息”

//在contentPanel.java内部
@凌驾
公共无效OneEvent(IEEvent事件){
super.onEvent(事件);
//检查这是否是计数器更新事件,如果是,请重新绘制self
if(event.getPayload()instanceof ContentUpdate){
ContentUpdate=(ContentUpdate)事件。getPayload();
//做些事情。。。
update.getTarget().add(此);
}
}

正如soorapadman所评论的,您应该使用问题事件来保持组件之间的分离(测试、可重用性等)。 在Wicket中,您可以找到一个简短的示例。我借用了他们的示例以适应您的问题:

事件的“有效负载”,在本例中是一个简单的包装类,带有一个AjaxRequest来帮助我们更新内容

    public class ContentUpdate {
        private final AjaxRequestTarget target;

        public CounterUpdate(AjaxRequestTarget target) {
            this.target = target;
        }

        public AjaxRequestTarget getTarget() {
            return target;
        }
    }
还有你的menuPanel课程

//inside menuPanel.java
@Override
protected void populateItem(ListItem<Link> link) {
  final WebMarkupContainer categoryMenuItemLink = new 
  WebMarkupContainer("categoryMenuItemLink");
  link.add(categoryMenuItemLink);
  link.add(new AjaxEventBehavior("click") {          

      @Override
      protected void onEvent(AjaxRequestTarget target) {
          send(getPage(), Broadcast.BREADTH, new ContentUpdate(target));
      }
   });
}
//在menuPanel.java内部
@凌驾
受保护的void populateItem(列表项链接){
最终WebMarkupContainer CategoryNuItemLink=新建
WebMarkupContainer(“categoryMenuItemLink”);
link.add(categoryMenuItemLink);
添加(新的AjaxEventBehavior(“单击”){
@凌驾
受保护的void onEvent(AjaxRequestTarget目标){
发送(getPage(),Broadcast.width,newcontentupdate(目标));
}
});
}
您的内容面板现在应该覆盖OneEvent方法以接收事件“消息”

//在contentPanel.java内部
@凌驾
公共无效OneEvent(IEEvent事件){
super.onEvent(事件);
//检查这是否是计数器更新事件,如果是,请重新绘制self
if(event.getPayload()instanceof ContentUpdate){
ContentUpdate=(ContentUpdate)事件。getPayload();
//做些事情。。。
update.getTarget().add(此);
}
}

谢谢你的回答,不幸的是每次我访问面板时它都是空的谢谢你的回答,不幸的是每次我访问面板时它都是空的,尽管你找到了这个问题的解决方案。如果组件在不同的类中,我建议
广播
事件。尽管你找到了这个问题的解决方案。我会d如果组件属于不同类别,则建议播放
事件。