Wicket Form中可重复使用的DropDownChoice

时间:2014-10-28 10:43:26

标签: forms wicket panel wicket-6 dropdownchoice

在我的项目中,我有50多个表单,它们大多是彼此相似的,并且使用相同的DropDownChoice组件。我可以创建单独的Panel,我在其中定义我的DropDownChoice,之后我将以另一种形式使用Panel吗?否则,我如何实现这种情况?

例如

form1有下一个字段:
名称TextField
TextField
城市DropDownChoice

form2有下一个字段:
代码TextField
TextField
城市(同样是DropDownChoice

我想为这种方法做出漂亮的解决方案。

1 个答案:

答案 0 :(得分:5)

最好使用预定义参数扩展DropDownChoice,而不是使用真实Panel扩展DropDownChoice

这种方法至少有两个优点:

  1. 您不需要创建单独的标记文件,因为它附带Panel - 方法。
  2. 您可以直接使用DropDownChoice方法。否则,您应该转发Panel方法等方法,或者为DDC实现getter方法。

  3. 所以,这样的事情会更好:

    public class CityDropDownChoice extends DropDownChoice<City> // use your own generic
    {
    
        /* define only one constructor, but you can implement another */
        public CityDropDownChoice ( final String id )
        {
            super ( id );
    
            init();
        }
    
        /* private method to construct ddc according to your will */
        private void init ()
        {        
            setChoices ( /* Your cities model or list of cities, fetched from somewhere */ );
            setChoiceRenderer ( /*  You can define default choice renderer */ );
    
            setOutputMarkupId ( true );
    
            /* maybe add some Ajax behaviors */
            add(new AjaxEventBehavior ("change")
            {
                @Override
                protected void onEvent ( final AjaxRequestTarget target )
                {
                    onChange ( target );
                }
            });
        }
    
        /*in some forms you can override this method to do something
          when choice is changed*/
        protected void onChange ( final AjaxRequestTarget target )
        {
            // override to do something.
        }
    }
    

    在您的表单中,只需使用:

    Form form = ...;
    form.add ( new CityDropDownChoice ( "cities" ) );
    

    认为这种方法符合您的需求。