Wicket:选择多行(Shift-Click)

时间:2016-01-19 21:56:59

标签: javascript java html wicket

是否可以通过点击一行,按Shift键然后点击另一行来在Wicket中选择多行?

我正在使用Wicket 6.20。我已经找到了选择单行的代码,但我不知道如何添加AJAX事件以确定用户是否按下了shift键。

@Override
protected Item<T> newRowItem(final String id, final int index, final IModel<T> model) {
    final Item<T> rowItem = new OddEvenItem<>(id, index, model);
    rowItem.add(new AjaxEventBehavior("onclick") {

        private static final long serialVersionUID = 6720512493017210281L;

        @Override
        protected void onEvent(AjaxRequestTarget target) {

            SearchResultsRow row = (SearchResultsRow) rowItem.getModelObject();
            row.setSelected(!row.isSelected());

            parent.updateSearchResults(target);
        }
    });
    return rowItem;
}

5 个答案:

答案 0 :(得分:5)

我将此代码段用于shift / ctrl ajax-click:

public class AjaxClickWithKeysBehavior extends AjaxEventBehavior
{

    public AjaxClickWithKeysBehavior()
    {
        super( "click" );
    }

    @Override
    protected void updateAjaxAttributes( AjaxRequestAttributes attributes )
    {
        super.updateAjaxAttributes( attributes );

        attributes.getDynamicExtraParameters().add( "return {'ctrl' : attrs.event.ctrlKey, 'shift' : attrs.event.shiftKey}" );
    }

    @Override
    protected void onEvent( AjaxRequestTarget target )
    {
        final RequestCycle requestCycle = RequestCycle.get();

        boolean isCtrl = requestCycle.getRequest().getRequestParameters().getParameterValue( "ctrl" ).toBoolean( false );
        boolean isShift = requestCycle.getRequest().getRequestParameters().getParameterValue( "shift" ).toBoolean( false );

        this.onClick( target, isCtrl, isShift );
    }

    protected void onClick( AjaxRequestTarget target, boolean isCtrl, boolean isShift )
    {
    }

}

答案 1 :(得分:1)

好奇;为什么不使用带有复选框的列表视图呢?你试图实现的解决方案似乎更多的是Javascript编码然后Wicket本身。我相信你可以在Stackoverflow上找到多个答案,以实现从javascript的多行选择。

对于带有复选框的Wicket列表视图,您可以查看:https://cwiki.apache.org/confluence/display/WICKET/Listview+with+checkboxes

您可能有正当理由选择shift + click。但它可能会限制您所在的页面(如果您的表格具有分页),并且在返回时也不会保留选择。

答案 2 :(得分:1)

是的,这是可能的。有组件org.apache.wicket.markup.html.form.ListMultipleChoice所以我认为你必须使用它。

此组件提供您期望的行为。您可以阅读Wicket Docs

中的文档

答案 3 :(得分:1)

WicketStuff-DataTables提供与https://datatables.net/的集成。通过使用其Select扩展名,可以根据需要选择行。

我刚刚添加了对master分支的Select扩展的支持。它将与WicketStuff 7.2.0一起提供。您可以在无限/虚拟滚动示例中看到它的实际效果。

答案 4 :(得分:0)

以下是您可以使用标准ajaxlink的版本:

public abstract class KeyedAjaxLink extends AjaxLink<Object> {

  private static final long serialVersionUID = 1L;

  /**
   * @param p_id
   */
  public KeyedAjaxLink( String p_id ) {
    super( p_id );
  }

  /**
   * @param p_id
   * @param p_model
   */
  public KeyedAjaxLink( String p_id, IModel<Object> p_model ) {
    super( p_id, p_model );
  }

  @Override
  protected void updateAjaxAttributes( AjaxRequestAttributes p_attributes ) {
    super.updateAjaxAttributes( p_attributes );

    p_attributes.getDynamicExtraParameters().add( "return {'ctrl' : attrs.event.ctrlKey, 'shift' : attrs.event.shiftKey, 'alt' : attrs.event.altKey }" );
  }

  protected boolean isShiftPressed() {
    return isPressed( "shift" );
  }

  protected boolean isCtrlPressed() {
    return isPressed( "ctrl" );
  }

  protected boolean isAltPressed() {
    return isPressed( "alt" );
  }

  protected boolean isPressed( String p_keyCode ) {
    return RequestCycle.get().getRequest().getRequestParameters().getParameterValue( p_keyCode ).toBoolean( false );
  }
}