是否可以通过点击一行,按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;
}
答案 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 );
}
}