2012-09-25 22 views
5

Estoy trabajando en la implementación de un ListBox que quiero poder alertar al usuario cuando hacen una selección en el ListBox. ¿Hay alguna manera de responder al usuario haciendo clic en un elemento en el cuadro de lista y responder a la selección antes de que se produzca un "evento de cambio" para evitar que se active el evento changeEvent? He intentado usarGWT - ListBox, cómo previsualizar changeEvent

Event.addNativePreviewHandler(new NativePreviewHandler() { 
    @Override 
    public void onPreviewNativeEvent(NativePreviewEvent event) { 
     System.out.println("EVENT: " + event.getTypeInt()); 
    } 
}); 

pero esto nunca responde al hacer clic en un elemento específico en el cuadro de lista, que sólo responde a hacer clic en el cuadro de lista en un principio, cuando uno se concentra el ListBox. Quiero ser capaz de hacer algo como:

Event.addNativePreviewHandler(new NativePreviewHandler() { 
    @Override 
    public void onPreviewNativeEvent(NativePreviewEvent event) { 
     if(event is changeEvent && event source is listBox) { 
      if(do some check here) 
      event.stopPropagation(); 
     } 
    } 
}); 

Cualquier sugerencia sería muy apreciada, gracias!

+0

@AndreiVolgin gracias por su respuesta. Quiero poder permitirles que hagan clic en las opciones, y luego solicitarles una ventana emergente, aceptar continuar, y luego continuar ejecutando el evento changeEvent o cancelar el evento changeEvent en función de su respuesta a la ventana emergente. –

Respuesta

4

Gracias a todos por sus comentarios. Lo que terminé haciendo fue guardar el estado de la selección cuando el cuadro de lista se enfoca. Y guardando este índice y cambiándolo cuando changeEvent ocurra solo cambiándolo a la siguiente selección si está permitido.

@UiHandler("listBox") 
public void onListBoxFocus(FocusEvent event) { 
    this.saveListBoxSelection = listBox.getSelectedIndex(); 
} 

@UiHandler("listBox") 
public void onChange(ChangeEvent event) { 
    int newSelection = listBoxCompliant.getSelectedIndex(); 
    listBox.setSelectedIndex(this.saveListBoxSelection); 
    if(proceed with change) 
     listBox.setSelectedIndex(newSelection); 
    else 
     //cancel event 

Esto se hace utilizando un uibinder, pero también se puede hacer simplemente agregando estos eventos directamente al listBox. ¡Nuevamente, muchas gracias por los comentarios!

1

No hay ningún daño al permitir que ChangeEvent continúe. Puede agregar su lógica al manejador ChangeEvent. Si un usuario decide no continuar, simplemente ajuste la selección a la anterior o elimine la selección.

@Override 
onChange(ChangeEvent event) { 
    // ask user if he wants to continue 
    // if yes 
     doSomething(); 
    // if no 
     myList.setSelectedIndex(-1); 
} 
3

Usted puede simplemente matar al evento si no quiere tratarlo:

@Override 
onChange(ChangeEvent event) { 
    // ask user if he wants to continue 
    // if yes 
     doSomething(); 
    // if no 
     event.kill(); 
} 
+0

Si mata el evento, ¿revertirá la selección? –

+0

@AndreiVolgin Si desea revertir, agregue una variable que mantendrá el valor de la selección en cada cambio, y cuando no quiera continuar, matará el evento y restablecerá la selección al último valor en la variable –

+0

@AdelBoutros Terminé almacenando el valor en un evento de enfoque y volviendo a cambiarlo en el evento de cambio. No terminé usando el evento kill, lo investigaré, ¡gracias por las sugerencias! –