在Wicket中我有一个包含两个Panels
的网站:
<body>
<wicket:panel>
<div wicket:id="menu"></div>
<div wicket:id="content"></div>
</wicket:panel>
</body>
menu-Panel
在links
内生成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
:
答案 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);
}
}