从Wicket中的不同面板更新面板
在Wicket中,我有一个包含两个从Wicket中的不同面板更新面板,wicket,Wicket,在Wicket中,我有一个包含两个面板的站点: <body> <wicket:panel> <div wicket:id="menu"></div> <div wicket:id="content"></div> </wicket:panel> </body> 如您所见,每个链接都添加了一个AjaxEventBehavior。我的问题是现在我无法访问内
面板的站点:
<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如果组件属于不同类别,则建议播放事件。