2015-02-27 1 views
0

У меня есть CellTable с несколькими строками, для которых я использую MultiSelectionModel. Первый столбец - это столбец флажков. Когда пользователь проверяет один из флажков, выбирается строка (в соответствии с примером на сайте), и когда пользователь нажимает на строку, вызывается функция «doActionOnRow()».В GWT CellTable, как я могу заставить ячейку использовать событие click, чтобы оно не доходило до строки?

Моя проблема в том, что когда пользователь проверяет флажок, также вызывается «doActionOnRow()». Как я могу заставить CheckboxCell использовать событие click, чтобы оно не запускалось и на клеточной таблице?

EDIT:

Это мой код:

table.addCellPreviewHandler(new Handler<Patient>() { 
     @Override 
     public void onCellPreview(CellPreviewEvent<Patient> event) { 
      boolean isClick = "click".equals(event.getNativeEvent().getType()); 
       if (isClick) { 
        doSomething(); 
       } 
      }}); 

Column<Patient, Boolean> checkColumn = new Column<Patient, Boolean>(new CheckboxCell(true, false)) { 
     @Override 
     public Boolean getValue(Patient object) { 
      // Get the value from the selection model. 
      return sm.isSelected(object); 
     } 

     @Override 
     public void onBrowserEvent(Context context, Element elem, Patient patient, NativeEvent event) { 
      if ("click".equals(event.getType())) 
       event.stopPropagation(); 

      super.onBrowserEvent(context, elem, patient, event); 
     } 
    }; 

table.addColumn(checkColumn, SafeHtmlUtils.fromSafeConstant("<br/>")); 

Даже когда я добавляю event.stopPropagation();doSomething(); вызывается, когда я нажимаю флажок.

Любая идея, почему?

ответ

0

Вам нужно проверить, где произошло событие сначала (в ячейке или в строке: я забыл эту точку). то вы просто звоните event.stopPropagation()

Вы также можете решить, в столбце, хотите ли вы сделать что-то с щелчком этим путем (фрагмент из моего проекта)

productColumn = new Column<ProductProxy, ProductProxy>(productCoreCell) { 
     @Override 
     public ProductProxy getValue(ProductProxy productProxy) { 
      return productProxy; 
     } 

     @Override 
     public void onBrowserEvent(Context context, Element elem, ProductProxy object, NativeEvent event) { 
      getProductTableManager().rowSelected(object); 
     } 
    }; 
+0

Doesnt похож на работу. Я редактировал свой вопрос и добавил свой код. – Oberon

+0

Этот шов вы вызываете super.onBrowserEvent() после прекращения распространения, посмотрите исходный код GWT, чтобы увидеть, что они делают с событием, распространение которого было остановлено: я не думаю, что они справляются с этим). Как вы видите, в моем коде я беру дескриптор события. Вы должны прекратить распространение в тот момент, когда вам больше не нужен GWT, чтобы что-то сделать. Это означает, что на данный момент вы потребляете событие, например, onClick(), не в том месте, где вы отправите задание в GWT, чтобы они обрабатывали событие –

+0

Другими словами: либо не вызывайте super.onBrowserEvent (контекст, elem, patient, событие) и обрабатывать его самостоятельно Или зайдите в onCellPreview(), в каком столбце вы должны знать, хотите ли вы вызвать event.stopPropagation() или нет –