如何从Apache Wicket中的另一个ListView刷新面板?

如何从Apache Wicket中的另一个ListView刷新面板?,wicket,Wicket,我有一个面板,比如AlertPanel,当listView呈现时,它需要在某些情况下刷新 我正在考虑更新listview的onBeforeRender生命周期方法中的AlertPanel 我尝试过像这样覆盖onBeforeRender- 一旦我有了this.getPage.getalertPanel,我就不知道要调用org.apache.wicket.markup.html.panel.panel的哪个API,这样我就可以刷新/重新绘制AlertPanel了。如果渲染已经开始,并且似乎已经-on

我有一个面板,比如AlertPanel,当listView呈现时,它需要在某些情况下刷新

我正在考虑更新listview的onBeforeRender生命周期方法中的AlertPanel

我尝试过像这样覆盖onBeforeRender-


一旦我有了this.getPage.getalertPanel,我就不知道要调用org.apache.wicket.markup.html.panel.panel的哪个API,这样我就可以刷新/重新绘制AlertPanel了。如果渲染已经开始,并且似乎已经-onBeforeRender,那么您将无法替换任何组件

您应该将逻辑移到操作阶段,例如onClick、onSubmit等。在这种操作方法中,广播事件:sendgetPage、broadcast.DEPTH、new SomeCustomEvent。然后,在AlertPanel的父级中,您应该覆盖onEventIEvent,当事件负载为SomeCustomEvent时,则执行替换

有关更多信息,请阅读:

有两种方法: 1复杂的一个:使用监听器 2或使用方法重写,如下所示:

AlertPanel alertPanel = new AlertPanel();
alertPanel.setOutputMarkupId(true);

ListView list = new MyListView(){
     @Override
     protected onMyEvent(AjaxRequestTarget target){
         target.add(alertPanel);
     }
}

page.add(alertPanel,list);

MyListView的onMyEvent方法可以是抽象的,必须在您要更新MyListView内部的alertPanel的位置调用,例如,当在某些行中按下按钮时,使用替换组件将对您有效。请检查此链接。但是我仍然不满意你打电话给AlertPanel的方式谢谢你的回复,但是请你把所有的东西都放在一个评论中,因为这样很难参考。另外,请详细说明为什么以我的方式提交的面板不可用的原因good@soorapadman这样有什么问题?请建议对此.getPage.getalertPanel提供更好的替换,因为它返回一个组件。我可以转换它,但我不认为我应该,因为组件已经有了替换项,我已经尝试过了,但是没有用。老实说,用这段代码我无法解决这个问题。请更新您添加panelAlertPanel的位置您是如何尝试替换的?请使用martin-g答案进行检查。但我仍然不确定你想做的是什么,你在某方面是正确的。如果组件与页面相同,为什么需要使用广播事件?。target.addalertPanel足够对吗?如果我错了,请原谅。如果组件之间有引用,则不需要事件。但是,页面通常是由单独的组件/容器构成的,这些组件/容器互不了解。为了避免紧密耦合,我建议通过消息(即事件)进行通信。
AlertPanel alertPanel = new AlertPanel();
alertPanel.setOutputMarkupId(true);

ListView list = new MyListView(){
     @Override
     protected onMyEvent(AjaxRequestTarget target){
         target.add(alertPanel);
     }
}

page.add(alertPanel,list);