Java 子组件未通过onConfigure更新下拉选择

Java 子组件未通过onConfigure更新下拉选择,java,wicket,Java,Wicket,我有一个下拉列表,根据选择,更新页面上的一些免责声明文本。下拉列表和免责声明都是自己的面板(自己的标记和组件)。我想让第一次加载页面时,不显示免责声明。无论何时从下拉列表中进行选择,免责声明都会显示 DropDownPanel.java private boolean firstTimeLoaded = true; ... disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTim

我有一个下拉列表,根据选择,更新页面上的一些免责声明文本。下拉列表和免责声明都是自己的面板(自己的标记和组件)。我想让第一次加载页面时,不显示免责声明。无论何时从下拉列表中进行选择,免责声明都会显示

DropDownPanel.java

private boolean firstTimeLoaded = true;

...

disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTimeLoaded );
disclaimerPanel.setOutputMarkupId( true );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );

...

dropDownChoice.getInternalComponent().add( new AjaxFormComponentUpdatingBehavior( "onchange" )
    {
        @Override
        protected void onUpdate( AjaxRequestTarget ajaxRequestTarget )
        {
            // METHOD 1 
            disclaimerPanel = new Disclaimer( "disclaimer", contactModel, !firstTimeLoaded );
            disclaimerPanel.setOutputMarkupPlaceholderTag( true );
            disclaimerPanel.setOutputMarkupId( true );

            // METHOD 2
            // remove code from METHOD 1 as onConfigure should set visibility of DisclaimerPanel using addComponent

            ajaxRequestTarget.addComponent( disclaimerPanel );
            ajaxRequestTarget.addChildren( disclaimerPanel, Component.class );

        }
private boolean firstTimeLoaded;

public DisclaimerPanel( String id, IModel<Contact> contactModel, boolean firstTimeLoaded )
    {
        ...
        this.firstTimeLoaded = firstTimeLoaded;
    }

@Override
    protected void onConfigure()
    {
        setVisible( !firstTimeLoaded );
    }
    
免责声明面板.java

private boolean firstTimeLoaded = true;

...

disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTimeLoaded );
disclaimerPanel.setOutputMarkupId( true );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );

...

dropDownChoice.getInternalComponent().add( new AjaxFormComponentUpdatingBehavior( "onchange" )
    {
        @Override
        protected void onUpdate( AjaxRequestTarget ajaxRequestTarget )
        {
            // METHOD 1 
            disclaimerPanel = new Disclaimer( "disclaimer", contactModel, !firstTimeLoaded );
            disclaimerPanel.setOutputMarkupPlaceholderTag( true );
            disclaimerPanel.setOutputMarkupId( true );

            // METHOD 2
            // remove code from METHOD 1 as onConfigure should set visibility of DisclaimerPanel using addComponent

            ajaxRequestTarget.addComponent( disclaimerPanel );
            ajaxRequestTarget.addChildren( disclaimerPanel, Component.class );

        }
private boolean firstTimeLoaded;

public DisclaimerPanel( String id, IModel<Contact> contactModel, boolean firstTimeLoaded )
    {
        ...
        this.firstTimeLoaded = firstTimeLoaded;
    }

@Override
    protected void onConfigure()
    {
        setVisible( !firstTimeLoaded );
    }
    
private boolean firsttimeload;
公共免责声明面板(字符串id、IModel contactModel、布尔值firstTimeLoaded)
{
...
this.firstTimeLoaded=firstTimeLoaded;
}
@凌驾
配置()上受保护的空
{
setVisible(!firstTimeLoaded);
}
我尝试了两种方法,但都不起作用(方法1,方法2)。在断点中,
onConfigure
第一次运行并正确隐藏免责声明。当我做出选择时;但是,
DisclaimerPanel
的构造函数将
firstTimeLoaded
设置为
false
,但不会执行
onConfigure
。我错过了什么


提前谢谢

无需在onUpdate()中创建新的免责声明面板实例。您只需切换其
firstTimeLoaded
值,然后将
disclaimerPanel
添加到AjaxRequestTarget。您可以将
firstTimeLoaded
的setter添加到DisclaimerPanel,或者使用
IModel
而不是普通的
布尔值
作为构造函数参数


在创建新实例的代码中,需要将旧实例替换为:
replace(disclaimerPanel)
。这是必要的,因为在Wicket中,页面就像一个树数据结构——页面是根,它可能有分支——它的第一级组件,它们可能有自己的分支——它们的子组件,等等。因此,这里您创建了一个新的免责声明面板实例,但不将其添加到任何父组件中。您需要使用
parent.replace(disclaimerPanel)
,然后将
disclaimerPanel
添加到AjaxRequestTarget,以便Wicket在Ajax响应中呈现其HTML。

您使用的Wicket版本是什么?如果是8或从不
ajaxformcomponentupdatebehavior(“onchange”)
需要更改为
ajaxformcomponentupdatebehavior(“change”)
。自wicket 6.0以来,他们对其进行了更改,因此您不再需要事件名称中的前导“on”。直到wicket 8之前,他们都支持这两个版本,因为wicket 8.0的开头“on”不再受支持。@哦,我相信它是版本4(1.4.23)。对不起,我已经编辑了这个问题。我添加了
firstTimeLoaded=false添加或替换(自动存储面板)
并从方法1中删除了行,但它仍然不起作用。我在原始代码中将
免责声明面板
添加到AjaxRequestTarget中。这与
添加或替换
有什么区别?我也更新了我的答案。