从 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-Panel
在 ListView
:
中生成 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
:
- menuPanel.java
- contentPanel.java
在您的事件处理程序中,您可以使用 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);
}
}
在 Wicket 中,我有一个包含两个 Panels
:
<body>
<wicket:panel>
<div wicket:id="menu"></div>
<div wicket:id="content"></div>
</wicket:panel>
</body>
menu-Panel
在 ListView
:
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
:
- menuPanel.java
- contentPanel.java
在您的事件处理程序中,您可以使用 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);
}
}