2016-06-13 59 views
1

我正在使用带有MultiSelectionModel的GWT DataGrid。GWT DataGrid:同时使用CheckboxCell选择和标准行模式选择

网格的项目的选择应当由

a)一种CheckboxColumn在同一时间CheckboxCell

和另外通过

b)中的标准来实现在线模式选择 - 型号(通过点击该行的其余部分)。

使用CheckboxColumn,应该启用用户以多选不同的条目。但是当在数据网格线上的其他地方点击时,应该完成单行选择策略,这意味着如果在使用复选框之前完成了多项选择,则应该重置该选择,并且只有被点击的行应该之后选择。

这就是我所拥有的。有谁知道如何同时启用复选框模式和行选择模式?

public class JobDataGrid extends DataGrid<Job> 
{ 
    private MultiSelectionModel<Job> selectionModel; 

    private Column<Job, Boolean> checkboxColumn; 
    private TextColumn<Job> idColumn; 
    private TextColumn<Job> titleColumn; 
    private TextColumn<Job> timestampColumn; 
    private TexTColumn<Job> ... 

    public JobDataGrid() 
    { 
     super(); 

     checkboxColumn = new Column<Job, Boolean> (new CheckboxCell (true, false)) { 
      @Override 
      public Boolean getValue (Job job) 
      { 
       // Get the value from the selection model. 
       return selectionModel.isSelected (job); 
      } 
     }; 
     checkboxColumn.setFieldUpdater (new FieldUpdater<Job, Boolean>() { 
      public void update (int index, Job job, Boolean value) 
      { 
       // Called when the user clicks on a checkbox. 
       selectionModel.setSelected (job, value); 
      } 
     }); 

     // [...] 
     // [...] 
     // [...] 

     selectionModel = new MultiSelectionModel<Job>(); 
     setSelectionModel (selectionModel); 
     // setKeyboardSelectionPolicy (KeyboardSelectionPolicy.DISABLED); 

     // [...] 
     // [...] 
     // [...] 
    } 
} 

我已经尝试了所有4个变种

new CheckboxCell (false, false); 
new CheckboxCell (true, false); 
new CheckboxCell (false, true); 
new CheckboxCell (true, true); 

但没有人出现了我所需要的。而且我也打了

setSelectionModel (selectionModel, DefaultSelectionEventManager.<Job> createCheckboxManager()); 

也许

createCustomManager(DefaultSelectionEventManager.EventTranslator<T> translator) 

将帮助?

感谢名单 托马斯

回答

3

您可以创建自己的“复选框经理”,做你想要那里。

table.setSelectionModel(selectModel, DefaultSelectionEventManager.<DocumentListItemDTO> createCustomManager(
      new DefaultSelectionEventManager.CheckboxEventTranslator<DocumentListItemDTO>() { 
       @Override 
       public SelectAction translateSelectionEvent(CellPreviewEvent<DocumentListItemDTO> event) { 
        SelectAction action = super.translateSelectionEvent(event); 
        if (action.equals(SelectAction.IGNORE)) { 

         if (!event.getNativeEvent().getCtrlKey() && !event.getNativeEvent().getShiftKey()) 
          selectionModel.clear(); 

         return SelectAction.TOGGLE; 

        } 
        return action; 
       } 
      })); 
+0

好,谢谢,但事件和线路点击事件吗? –

1

Lista's answer表现出正确的方向!

为了展现DefaultSelectionEventManager.CheckboxEventTranslator的使用情况,其在网络上唯一几乎都可以找到例子,这里是要求一个功能齐全的解决方案:如何筛选用于checkboxCell点击

setSelectionModel (selectionModel, DefaultSelectionEventManager.<Job> createCustomManager (
     new DefaultSelectionEventManager.CheckboxEventTranslator<Job>() { 

      @Override 
      public SelectAction translateSelectionEvent (CellPreviewEvent<Job> event) 
      { 
       NativeEvent nativeEvent = event.getNativeEvent(); 

       // Determine if we clicked on a checkbox. 
       Element target = nativeEvent.getEventTarget().cast(); 
       if ("input".equals (target.getTagName().toLowerCase (Locale.ROOT))) 
       { 
        final InputElement input = target.cast(); 
        if ("checkbox".equals (input.getType().toLowerCase (Locale.ROOT))) 
        { 
         // Synchronize the checkbox with the current selection state. 
         input.setChecked (event.getDisplay().getSelectionModel().isSelected (
           event.getValue())); 
         return SelectAction.TOGGLE; 
        } 
       } 
       else 
       { 
        if (BrowserEvents.CLICK.equals (nativeEvent.getType())) 
        { 
         selectionModel.clear(); 
         return SelectAction.SELECT; 
        } 
       } 
       return SelectAction.IGNORE; 
      } 
     }));