如何隐藏DateTextField时隐藏DatePicker图标?

时间:2011-07-29 18:30:35

标签: java wicket

我在表单中使用DatePickerorg.apache.wicket.extensions.yui.calendar.DatePicker - Javadoc)。表单由两个字段组成。第一个字段是下拉列表,第二个字段根据第一个字段动态更改。如果选择“文本”,则会出现一个文本框;如果选择“列表”,则会出现一个下拉菜单;如果选择“日期”,则会出现日期选择器和相关字段。

以下是我当前代码的简化版本:

DateTextField dateField = new DateTextField("dateField", // ...
DatePicker datePicker = new DatePicker();
dateField.add(datePicker);

fieldOne.add(new OnChangeAjaxBehavior() {
    protected void onUpdate(AjaxRequestTarget target) {
        if (fieldOne.equalsIgnoreCase("list"))
        {
            dateField.setVisible(false);
            // datePicker.setVisible(false); // This line is impossible
            listField.setVisible(true);
            textField.setVisible(false);
        }
        else if { /* similar visibility settings for dates and text */ }
    }
});

表单目前可以正常用于将更改为日期选择器。选择日期然后用户选择其他内容时会出现问题。日期字段消失,但日期选择器仍保留在屏幕上。不幸的是,它似乎没有setVisible()方法或任何等效方法。事实上,它甚至不是真正的Wicket Component

如何让它们一起出现/消失?如果我无法直接设置选择器的可见性,我可以将其与场的可见性联系起来吗?

2 个答案:

答案 0 :(得分:1)

到目前为止,最简单但仍然相当可维护的解决方案是将要隐藏的组件分组到WebMarkupContainer中。在标记中,您可能希望对容器使用<div>元素,但这取决于您要隐藏的内容。 (有时标记本身会阻止您使用此方法,但我们希望您的标记不会。:))

然后只需更改容器的可见性。

答案 1 :(得分:0)

使用AjaxListeners的一个好主意是在要处理的Component上调用.setOutputMarkupId(true)。否则你可能无法“找到”它。

如果你没有在加载时渲染它,但打算稍后添加该组件,我认为你也应该调用setOutputMarkupPlaceholderTag(true)

这对我有好几次帮助......