【问题标题】:Wicket: Select Multiple Rows (Shift-Click)Wicket:选择多行(Shift-单击)
【发布时间】:2016-04-25 13:42:24
【问题描述】:

是否可以通过单击一行、按 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;
}

【问题讨论】:

    标签: javascript java html wicket


    【解决方案1】:

    我将这个 sn-p 用于 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 )
        {
        }
    
    }
    

    【讨论】:

    • 随时在某处发布您的调整:)(并接受答案;)
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          这是一个您可以使用标准 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 );
            }
          }
          

          【讨论】:

            猜你喜欢
            • 2020-01-21
            • 2019-08-11
            • 2013-07-31
            • 2012-06-25
            • 2013-08-19
            • 2012-10-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-10
            相关资源
            最近更新 更多