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

例如
form1具有以下字段:
名称(TextField)
(TextField)
城市(DropDownChoice)
form2具有以下字段:
代码(TextField)
数量(TextField)
城市(同样是DropDownChoice)

我想为这种方法提供漂亮的解决方案。

最佳答案

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

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

  • 您不需要创建单独的标记文件,因为它带有Panel -approach。
  • 您可以直接使用DropDownChoice方法。否则,您应该转发诸如Panel的方法之类的方法,或者为DDC实现getter方法。


  • 因此,最好是这样的:

    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" ) );
    

    认为这种方法将满足您的需求。

    10-04 11:00