Wicket中不同Panel的更新面板

时间:2017-11-07 17:47:33

标签: wicket

在Wicket中我有一个包含两个Panels的网站:

<body>
    <wicket:panel>
        <div wicket:id="menu"></div>
        <div wicket:id="content"></div>
    </wicket:panel>
</body>

menu-Panellinks内生成ListView

//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");
        }
    });
}

正如您所看到的,每个link添加了AjaxEventBehavior。我现在的问题是我无法访问content-Panel来更新其内容。 所以我要找的是这样的:

 // 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);
        }
    });
}

每个Panel位于不同的class

  • menuPanel.java
  • contentPanel.java

3 个答案:

答案 0 :(得分:2)

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

abstract Panel getContentPanel();

当您在页面上添加面板时,您需要实现abtsract方法:

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

现在在活动中你可以获得contentPanel

答案 1 :(得分:1)

在您的事件处理程序中,您可以使用findParent(OuterPanel.class),其中OuterPanel.class是您在问题开头描述的面板(即包含菜单和内容面板的面板)。 获得后,您可以使用outerPanel.get("content")

获取内容面板

答案 2 :(得分:1)

正如soorapadman评论的那样,您应该使用事件来解决问题,以保持组件之间的分离(测试,可重用性等)。 在Wicket examples中,您会找到一个简短的demonstration。我借用他们的code来适应你的问题:

您的事件的“有效负载”,在这种情况下是一个简单的包装类,带有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));
      }
   });
}

您的内容面板现在应覆盖onEvent方法以接收事件“message”。

 //inside contentPanel.java
    @Override
    public void onEvent(IEvent<?> event) {
        super.onEvent(event);

        // check if this is a counter update event and if so repaint self
        if (event.getPayload() instanceof ContentUpdate) {
            ContentUpdate update = (ContentUpdate)event.getPayload();
            // Do some stuff ...
            update.getTarget().add(this);
        }
    }