2014-09-27 71 views
0

我想實現一個包含ListView的自定義窗體組件。Wicket - 如何在自定義窗體組件中使用ListView?

我的自定義表單組件:

public class NotificationDataListPanel extends FormComponentPanel { 

    private ListView<NotificationDataBean> listView = null; 

    public NotificationDataListPanel(String id) { 
     this(id, null); 
    } 

    public NotificationDataListPanel(String id, List list) { 
     super(id); 

     listView = new ListView<NotificationDataBean>("listView") { 
      @Override 
      protected void populateItem(final ListItem<NotificationDataBean> item) { 
       final NotificationDataPanel dataPanel = new NotificationDataPanel("dataPanel", new Model<NotificationDataBean>() { 
        @Override 
        public NotificationDataBean getObject() { 
         return item.getModel().getObject(); 
        } 

        @Override 
        public void setObject(final NotificationDataBean value) { 
         item.setModelObject(value); 
        } 
       }); 
       item.add(dataPanel); 
      } 
     }; 
     add(listView); 

     add(new AjaxLink("addNewNDPanel") { 
      @Override 
      public void onClick(AjaxRequestTarget target) { 
       List<NotificationDataBean> modelObject = listView.getModelObject(); 
       if (modelObject == null) { 
        modelObject = new ArrayList<NotificationDataBean>(); 
       } 
       modelObject.add(new NotificationDataBean()); 
       listView.setModelObject(modelObject); 

       target.add(this); 
      } 
     }); 
    } 

    @Override 
    protected void onBeforeRender() { 
     super.onBeforeRender(); 
     List<NotificationDataBean> modelObject = (List<NotificationDataBean>) getModelObject(); 
     if (modelObject != null && !modelObject.isEmpty()) { 
      listView.setModelObject(modelObject); 
     } else { 
      listView.setModel(new Model()); 
     } 
    } 

    @Override 
    protected void convertInput() { 
     List<NotificationDataBean> modelObject = listView.getModelObject(); 

     setConvertedInput(modelObject); 
     updateModel(); 
    } 
} 

NotificationDataPanel在其自身形式的偉大工程,在另一方面,我可以在表單中使用它ListView(不分離形式分量)。

正常工作:

final Form form = new Form("form", new CompoundPropertyModel(testFormBean)); 

    final ListView<NotificationDataBean> strs = new ListView<NotificationDataBean>("notiL") { 
     @Override 
     protected void populateItem(final ListItem<NotificationDataBean> item) { 
      final NotificationDataPanel quxField = new NotificationDataPanel("str", new Model<NotificationDataBean>() { 
       @Override 
       public NotificationDataBean getObject() { 
        return item.getModel().getObject(); 
       } 

       @Override 
       public void setObject(final NotificationDataBean value) { 
        item.setModelObject(value); 
       } 
      }); 
      item.add(quxField); 
     } 
    }; 
    form.add(strs); 

但是,當我試圖分離形式組件使用它ListView我得到這個例外。

Last cause: No get method defined for class: class TestFormBean expression: listView 

NOT OK

final Form form = new Form("form", new CompoundPropertyModel(testFormBean)); 
    form.add(new NotificationDataListPanel("notiL")); 

TestFormBean類:

class TestFormBean implements Serializable { 
    List<NotificationDataBean> notiL; 
} 

字,的ListView異常是指ListView ID在NotificationDataListPanel

在此先感謝您提供如何解決此問題的任何提示,並請接受我對我英語不好的道歉。

回答

2

您沒有給ListView提供模型,所以它會在組件層次結構中搜索一個。 CompountPropertyModel將模型提供給子組件,並使用它們的id在模型上查找屬性。

你可能只想做:

new ListView<NotificationDataBean>("listView", list); 
相關問題