Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Wicket-具有ListItem和复选框的表单未设置复选框状态_Java_Wicket_Wicket 1.6 - Fatal编程技术网

Java Wicket-具有ListItem和复选框的表单未设置复选框状态

Java Wicket-具有ListItem和复选框的表单未设置复选框状态,java,wicket,wicket-1.6,Java,Wicket,Wicket 1.6,我有一个简单的ish表单,它在使用ListView的表单中包含数量可变的元素。每个元素都位于一个表行中,并包含一个名称(带有一个可以正常工作的链接)和一个复选框,该复选框将该行标记为删除。表单中只有复选框是可编辑的。表单底部有一个“删除选定项”按钮,用于删除选中复选框的所有条目 我曾尝试使用RepeatingView和ListView来执行此操作,但两者都有相同的问题—提交表单时复选框的内部模型状态未更新—它们总是错误的。在SearchWrapper类setSelected方法中,记录器输出从不

我有一个简单的ish表单,它在使用ListView的表单中包含数量可变的元素。每个元素都位于一个表行中,并包含一个名称(带有一个可以正常工作的链接)和一个复选框,该复选框将该行标记为删除。表单中只有复选框是可编辑的。表单底部有一个“删除选定项”按钮,用于删除选中复选框的所有条目

我曾尝试使用RepeatingView和ListView来执行此操作,但两者都有相同的问题—提交表单时复选框的内部模型状态未更新—它们总是错误的。在SearchWrapper类setSelected方法中,记录器输出从不显示(其他日志记录是这样的,因此它不是日志记录问题)

有人知道为什么这是错误的吗

public class SavedSearchesTab extends Panel
{
  private static final Logger LOGGER = ...
  /**
   * 
   */
  public SavedSearchesTab( String p_id )
  {
    super( p_id );

    Form<?> l_form = new Form<Object>( "savedsearchform" ) {

      /**
       * @see org.apache.wicket.markup.html.form.Form#onSubmit()
       */
      protected void onSubmit()
      {
        LOGGER.info( "Form Submitted!" );
        for( String l_paramName : getRequest().getRequestParameters().getParameterNames() ) {
          LOGGER.info( "FormParam: " + l_paramName + ", value=" + getRequest().getRequestParameters().getParameterValue( l_paramName ) );
        }


        onDeleteSelected();
      }

    };
    l_form.setOutputMarkupId( true );
    add( l_form );


    List<UserSavedSearch> l_searches = getSearches();

    ListView<UserSavedSearch> l_repeater = new ListView<UserSavedSearch>( "repeater", l_searches ) {

      protected void populateItem( final ListItem<UserSavedSearch> p_item )
      {
        final UserSavedSearch l_search = p_item.getModelObject();
        SearchWrapper l_wrapper = new SearchWrapper( l_search );

        AjaxLink<UserSavedSearch> l_link = new AjaxLink<UserSavedSearch>( "searchnamelink" ) {

          private static final long serialVersionUID = 1L;

          public void onClick( AjaxRequestTarget p_target )
          {
            selectSearch( l_search );
          }
        };
        String l_linkText = l_search.getName();
        Label l_linkLabel = new Label( "searchnamelabel", l_linkText );
        l_link.add( l_linkLabel );

        p_item.add( l_link );

        TextArea<String> l_descriptionArea = new TextArea<String>( "searchsummary", new Model<String>( toSummary( l_search ) ) );
        p_item.add( l_descriptionArea );


        CheckBox l_checkbox = new CheckBox("searchcheckbox", new PropertyModel<Boolean>( l_wrapper, "selected" ) );
        p_item.add( l_checkbox );
      }
    };

    l_repeater.setReuseItems( true );
    l_form.add(l_repeater);
  }

  private List<UserSavedSearch> getSearches() {
    List<UserSavedSearch> l_searches = new ArrayList<UserSavedSearch>();
    // Make a couple of example ones for testing
    UserSavedSearch l_eg = new UserSavedSearch();
    l_eg.setName( "Example Search 1" );
    l_eg.setSearchArea( SearchArea.CUSTOMERS );
    l_searches.add( l_eg );
    l_eg = new UserSavedSearch();
    l_eg.setName( "Example Search 2" );
    l_eg.setSearchArea( SearchArea.CUSTOMERS );
    l_searches.add( l_eg );
    return l_searches;
  }

  private String toSummary( UserSavedSearch p_search ) {
    return "Summary of " + p_search.getName(); // TODO
  }

  protected void onDeleteSelected() {

  }

  protected void selectSearch( UserSavedSearch p_search ) {
    LOGGER.info( "Search " + p_search.getName() + " should be displayed!" );
  }  

  private class SearchWrapper implements Serializable {

    private static final long serialVersionUID = 1L;
    private UserSavedSearch m_data;
    private Boolean m_toDelete;

    public SearchWrapper( UserSavedSearch p_data ) {
      m_data = p_data;
      m_toDelete = false;
    }

    public boolean isSelected() {
      return m_toDelete;
    }

    public void setSelected( boolean p_selected ) {
     LOGGER.info( "SETTING SEARCHWRAPPER SELECTED STATE: " + p_selected );
      m_toDelete = p_selected;
    }

    public UserSavedSearch getSearch() {
      return m_data;
    }

  }
public类SavedSearchesTab扩展面板
{
专用静态最终记录器=。。。
/**
* 
*/
公共存储的searchestab(字符串p_id)
{
超级(p_id);
表格l_Form=新表格(“savedsearchform”){
/**
*@see org.apache.wicket.markup.html.form.form#onSubmit()
*/
受保护的void onSubmit()
{
LOGGER.info(“表单已提交!”);
对于(字符串l_paramName:getRequest().getRequestParameters().getParameterNames()){
LOGGER.info(“FormParam:+l_paramName+”,value=“+getRequest().getRequestParameters().getParameterValue(l_paramName));
}
onDeleteSelected();
}
};
l_form.setOutputMarkupId(真);
添加(l_表格);
列表l_searches=getSearches();
ListView l\u repeater=新建ListView(“repeater”,l\u搜索){
受保护的无效项目(最终列表项目p_项目)
{
final UserSavedSearch l_search=p_item.getModelObject();
SearchWrapper l_wrapper=新的SearchWrapper(l_搜索);
AjaxLink l_link=新的AjaxLink(“searchnamelink”){
私有静态最终长serialVersionUID=1L;
公共void onClick(AjaxRequestTarget p_目标)
{
选择搜索(l\U搜索);
}
};
字符串l_linkText=l_search.getName();
标签l_linkLabel=新标签(“searchnamelabel”,l_linkText);
l_link.add(l_linkLabel);
p_项。添加(l_链接);
TextArea l_descriptionArea=新的TextArea(“搜索摘要”,新模型(toSummary(l_搜索));
p_项。添加(l_说明区域);
复选框l_CheckBox=新复选框(“搜索复选框”,新属性模型(l_包装,“选中”);
p_项。添加(l_复选框);
}
};
l_repeater.setReuseItems(真);
l_表单添加(l_中继器);
}
私有列表getSearches(){
列表l_searches=new ArrayList();
//为测试做几个示例
UserSavedSearch l_eg=newusersavedsearch();
l_例如setName(“示例搜索1”);
l_例如setSearchArea(SearchArea.CUSTOMERS);
l_search.add(l_eg);
l_eg=new UserSavedSearch();
l_例如setName(“示例搜索2”);
l_例如setSearchArea(SearchArea.CUSTOMERS);
l_search.add(l_eg);
返回l_搜索;
}
私有字符串到摘要(UserSavedSearch p_search){
返回“Summary of”+p_search.getName();//TODO
}
已选定的受保护的无效项(){
}
受保护的void selectSearch(UserSavedSearch p_search){
LOGGER.info(“应该显示Search”+p_Search.getName()+”);
}  
私有类SearchWrapper实现可序列化{
私有静态最终长serialVersionUID=1L;
私有用户保存的搜索m_数据;
私有布尔m_-toDelete;
公共SearchWrapper(UserSavedSearch p_数据){
m_数据=p_数据;
m_toDelete=假;
}
公选{
返回m_toDelete;
}
已选择公共无效设置(已选择布尔p_){
LOGGER.info(“设置SEARCHWRAPPER选定状态:“+p_SELECTED”);
m_toDelete=p_已选择;
}
public UserSavedSearch getSearch(){
返回m_数据;
}
}
HTML:


保存的搜索

提前感谢。

问题在于,在填充复选框时,您没有定义清晰的模型对象。此模型的初始化方式应与onSubmit方法相同

我建议在SavedSearchesTab构造函数中实例化模型对象,确保变量是final,将其添加到表单中,并确保在所有层中使用它


关于你尝试恢复变量的方式,它不会以这种方式工作,这不是Wicket应该如何工作,如果你从我建议你的地方实例化你的模型对象,你可以在onSubmit方法上访问该变量,它将具有表单的属性,你不必在意将表单值映射到你的POJO,Wicket doe您是否尝试过使用
列表作为
列表视图的模型?
<wicket:panel>
    <span class="sectiontitle"><wicket:message key="sectiontitle">savedsearches</wicket:message></span>

    <form wicket:id="savedsearchform">
        <fieldset>
            <table id="savedsearchtable">
                <tbody wicket:id="repeater">
                    <tr>
                        <td><input wicket:id="searchcheckbox" type="checkbox" name="searchselect" wicket:message="value:fragment.select.search" /></td>
                        <td><a href="#" wicket:id="searchnamelink"><span wicket:id="searchnamelabel">searchname</span></a></td>
                    </tr>
                    <tr>
                        <td colspan="2"><textarea wicket:id="searchsummary" readonly="readonly" rows="3" cols="100"/></td>
                    </tr>
                </tbody>
                <tr class="buttonPanel">
                    <td colspan="2">
                        <input type="submit" wicket:message="value:button.deleteselectedsearches"/>
                    </td>
                </tr>
            </table>
        </fieldset>
    </form> 
</wicket:panel>