2016-06-13 71 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; 
      } 
     }));