2011-01-27 8 views

Respuesta

-1

Si quieres un texto celular que le permite apoyar su propia lista de eventos elegida, puede usar esto:

public class EventfulTextCell extends AbstractSafeHtmlCell`<String`> { 

    private static final String[] NO_CONSUMED_EVENTS = null; 

    public EventfulTextCell() { 
     this(NO_CONSUMED_EVENTS); 
    } 

    public EventfulTextCell(String... consumedEvents) { 
     super(SimpleSafeHtmlRenderer.getInstance(), consumedEvents); 
    } 

    @Override 
    public void render(Context context, SafeHtml value, SafeHtmlBuilder sb) { 
     if (value != null) { 
      sb.append(value); 
     } 
    } 
} 

Entonces instanciarlo:

new EventfulTextCell("click", "dblclick") 

A continuación, reemplazar el método onBrowserEvent() para procesar los eventos.

+0

esta es una manera desordenada de hacer las cosas de la OMI, pero funciona –

5

me hace a mano algo diferente que acaba de encajar mis necesidades:

cellTable.addCellPreviewHandler(new Handler<TitoloProxy>() { 

      long lastClick=-1000; 

      @Override 
      public void onCellPreview(CellPreviewEvent<TitoloProxy> event) { 
       long clictAt = System.currentTimeMillis(); 
       GWT.log("clickAt: "+(clictAt)); 
       GWT.log("lastClick: "+(lastClick)); 
       if(event.getNativeEvent().getType().contains("click")){ 
        GWT.log(""+(clictAt-lastClick)); 
        if(clictAt-lastClick < 300) { // dblclick on 2 clicks detected within 300 ms 
         Window.alert("I am a double click crafted event!"); 

        } 
        lastClick = System.currentTimeMillis(); 
       } 
      } 
     }); 
+2

Una más Se puede realizar una verificación elegante del tipo de evento en lugar de 'event.getNativeEvent(). getType(). contains (" click ")'. Pruebe 'Event.getTypeInt (event.getNativeEvent(). GetType()) == Event.ONCLICK', sustituyendo' Event.ONCLICK' con la enumeración correspondiente al evento deseado (probado con GWT 2.4). –

+0

Esto no admite eventos de un solo clic en parrellel = ( –

+0

@SuperKakes tiene razón, pero si utiliza la solución de Boris, podrá discriminar entre un solo clic y doble clic. Si aún desea usar mi solución, puede discriminar solo y haga doble clic en la prueba .contains ("click"). No lo he intentado. –

5
cellTable.addDomHandler(new DoubleClickHandler() { 

     @Override 
     public void onDoubleClick(DoubleClickEvent event) { 
      Window.alert("That's it!"); 
     } 
    }, DoubleClickEvent.getType()); 
+0

no podrá acceder a los datos de la celda o celda de esta manera, como índice de fila o columna. –

+0

Este controlador se activará si un usuario hace clic en cualquier lugar de una CellTable, incluido un encabezado o un espacio vacío que no está lleno de filas. No creo que sea una buena idea. –

1

Debido a que la interfaz de CellPreview no capta de forma nativa acontecimientos doble clic necesitará añadir lógica evento en el método anulado onCellPreview. Primero, pensaría que la mejor manera sería verificar las diferencias de tiempo de clic. Sin embargo, es mucho más eficiente y elegante usar una máquina de estado y contar clics. Esto es más robusto y le permite lidiar con múltiples casos de eventos: como el mouse hover, single y double clicks. El código es bastante directo. ¡Así que Disfrutá!

public class CellHoverHandler implements Handler<T> { 

    Timer singleClickTimer; 
    int clickCount = 0; 
    int clickDelay = 300; 

    @Override 
    public void onCellPreview(final CellPreviewEvent<T> event) { 
     if (Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONMOUSEOVER) { 
      handleOnMouseOver(event); 
     } else if (Event.getTypeInt(event.getNativeEvent().getType()) == Event.ONCLICK) { 
      clickCount++; 
      if (clickCount == 1) { 
       singleClickTimer = new Timer() { 

        @Override 
        public void run() { 
         clickCount = 0; 
         handleOnClick(event); 
        } 
       }; 
       singleClickTimer.schedule(clickDelay); 
      } else if (clickCount == 2) { 
       singleClickTimer.cancel(); 
       clickCount = 0; 
       handleOnDblClick(event); 
      } 
     } 
    } 

    private void handleOnMouseOver(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast(); 
     GWT.log("mouse over event"); 
    } 

    private void handleOnClick(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast(); 
     GWT.log("click event"); 
    } 

    private void handleOnDblClick(CellPreviewEvent<T> event) { 
     Element cell = event.getNativeEvent().getEventTarget().cast();    
     GWT.log("double click event"); 
    } 

OPTIMIZACIÓN: sentirse libre para pegar el recuento, el temporizador y retrasar miembros de la clase como estáticas o miembros globales para su reutilización. También verifique si el temporizador es nulo antes de hacer una nueva instancia. Había omitido esto por simplicidad. A diferencia de muchas otras técnicas, de esta manera todavía le proporciona acceso fácil y directo al evento celular. La técnica de sobrecargar el AbstractCell también funciona bien, sin embargo, a veces no tienes células personalizadas o quieres crear una celda personalizada para manejar eventos en la celda.

2
Integer row=0;// to hold row index 
Integer column=0;// to hold column index 
_Grid.addCellPreviewHandler(new CellPreviewEvent.Handler<Model>() { 
// this is to handle row id 
     @Override 
     public void onCellPreview(final CellPreviewEvent<Model> event) { 

      if (BrowserEvents.CLICK.equalsIgnoreCase(event.getNativeEvent().getType())) { 
       row = event.getIndex(); 
       column=event.getColumn(); 
      } 

     } 
    }); 

// because Doubleclick handler doesn't give row index or column index we will use addCellPreviewHandler to return row index or column index. 
_Grid.addDomHandler(new DoubleClickHandler() { 

     @Override 
     public void onDoubleClick(final DoubleClickEvent event) { 
      System.out.println(" You clicked row = " + row); 
      System.out.println(" You clicked column = " + column); 

     } 
    }, DoubleClickEvent.getType()); 
+0

En nuestro caso, ya estamos siguiendo el contexto de selección, por lo que agregar el controlador de esta manera funciona muy bien y es agradable y no invasivo. Y funciona con SelectionModels de cuadrícula, así como onCellPreview. –

1

Para listas de celdas, este código funciona bien:

cellList.addDomHandler(new DoubleClickHandler() { 
    @Override 
    public void onDoubleClick(DoubleClickEvent event) { 
     // do the stuff 
    } 
    }, DoubleClickEvent.getType()); 

No estoy seguro acerca de celdas de la tabla

Cuestiones relacionadas