Java Wicket-从另一个面板设置模型

Java Wicket-从另一个面板设置模型,java,wicket,wicket-6,wicket-1.5,Java,Wicket,Wicket 6,Wicket 1.5,我对维克特很陌生。我通过单击按钮从主面板(MainPanel)向子面板(ChartPanel)添加模型 MainPanel.java 单击按钮,我将在更改图表面板的模型后重新添加它。以下是我在主面板的按钮点击中使用的代码。这里,OnRenderAnotations事件是在UI中单击时生成的 @OnEvent public void onRenderAnnotations(RenderAnnotationsEvent aEvent) { LOG.trace("clicked on the

我对维克特很陌生。我通过单击按钮从主面板(
MainPanel
)向子面板(
ChartPanel
)添加模型

MainPanel.java

单击按钮,我将在更改图表面板的模型后重新添加它。以下是我在
主面板的按钮点击中使用的代码。这里,OnRenderAnotations事件是在UI中单击时生成的

 @OnEvent
public void onRenderAnnotations(RenderAnnotationsEvent aEvent)
{
    LOG.trace("clicked on the annotation");

    renderChart( aEvent.getRequestHandler());
}

private void renderChart(IPartialPageRequestHandler aRequestHandler)
{
    MultiValuedMap<String, Double> recommenderScoreMap = getLatestScores(aRequestHandler);
    Map<String,String> curveData = new HashMap<String,String>();
    LearningCurve learningCurve = new LearningCurve();

    for (String recommenderName : recommenderScoreMap.keySet()) {
        String data = recommenderScoreMap.get(recommenderName).stream().map(Object::toString)
                .collect(Collectors.joining(", "));

        curveData.put(recommenderName,data);

        learningCurve.setCurveData(curveData);

        learningCurve.setMaximumPointsToPlot(MAX_POINTS_TO_PLOT);
    }
    chartPanel.setDefaultModel(Model.of(learningCurve));

    // to avoid the error, A partial update of the page is being rendered
    try {
        aRequestHandler.add(chartPanel);
    }
    catch (IllegalStateException e) {
        LOG.warn("Not updating the chart. " + e.toString());
        setResponsePage(getPage());
    }
}
我的问题是,在上面的代码中,如何获取请求目标,因为它不是ajax请求,在参数中也没有。我是否应该使用其他的函数,在这里我也会得到一个requestTarget。但是我希望每次从任何地方更新
ChartPanel
的模型时都调用它

请原谅我的无知。我已经试了几天了,但我还是被卡住了。我试图解释它足够,但如果任何信息丢失,请评论,我会立即添加它


谢谢。

您应该替代
renderHead()

@Override
public void renderHead(IHeaderResponse response)
{
    super.renderHead(response);

    response.render(OnLoadHeaderItem.forScript(
            createJavascript(newLearningCurve)));
}

这样,无论是由于AjaxRequest添加的图表,还是仅仅在重新提交页面时添加的图表,都将正确显示图表。

它可以正常工作,但现在出现了问题。当我再次单击按钮时,表示
iPartialPageRequestHandler.add(图表面板)。然后它抛出'java.lang.IllegalStateException:正在呈现页面的部分更新,无法再添加组件[ChartPanel[component id=chart container]`它不允许我在同一页面上再次添加ChartPanel。在提神的时候效果很好。如何处理这种情况?在渲染之前单击按钮,因此应该可以添加组件。可以展开显示单击处理的第一个代码段吗?我展开了代码。annotationRender事件是由UI中的某些单击以及刷新选项卡引起的。因此,我仔细观察,刷新选项卡时会引发部分渲染异常。为此,我用try-catch包围了有问题的行。不确定这是否是避免此问题的正确方法。你能给我一个暗示吗?我还有一个非常重要的问题,引起了我的困惑。每次将组件添加到ajax目标时,是否都会调用组件的
renderHead
?我想确保java脚本的呈现在两种情况下进行。1) 在页面重新加载时,2)当组件添加到AJAX目标时。是的,在每次呈现时调用
renderHead()
,这包括通过AJAX更新组件时。
@Override
public void renderHead(IHeaderResponse response)
{
    super.renderHead(response);

    response.render(OnLoadHeaderItem.forScript(
            createJavascript(newLearningCurve)));
}