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

Update Panel from different Panel in Wicket

在 Wicket 中,我有一个包含两个 Panels:

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

menu-PanelListView:

中生成 links
//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:

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

获取内容面板

你可以让你的面板抽象并定义抽象方法:

abstract Panel getContentPanel();

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

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

现在在事件中你可以获得 contentPanel

正如 soorapadman 评论的那样,您应该针对您的问题使用事件来保持组件之间的分离(测试、可重用性等)。 在 Wicket examples you find a short demonstration. I borrowed their code 中使其适应您的问题:

一个 "payload" 用于您的活动,在本例中是一个简单的包装器 class,带有 AjaxRequest 以帮助我们更新内容。

    public class ContentUpdate {
        private final AjaxRequestTarget target;

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

        public AjaxRequestTarget getTarget() {
            return target;
        }
    }

还有你的菜单面板class

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