2012-09-25 21 views
5

Sto lavorando all'implementazione di un ListBox che desidero essere in grado di avvisare l'utente quando effettua una selezione nel ListBox. Esiste un modo per rispondere all'utente facendo clic su un elemento nella casella di riepilogo e rispondere alla selezione prima che si verifichi un evento "changeEvent", in modo da impedire che l'evento changeEvent venga attivato. Ho provato conGWT - ListBox, come visualizzare l'anteprima di changeEvent

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

ma questo non risponde mai a fare clic su un elemento specifico nella casella di riepilogo, che risponde solo a cliccando sul ListBox inizialmente, quando ci si concentra il ListBox. Voglio essere in grado di fare qualcosa di simile:

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(); 
     } 
    } 
}); 

Qualsiasi suggerimento sarebbe molto apprezzato, grazie!

+0

@AndreiVolgin grazie per la vostra risposta. Voglio essere in grado di consentire loro di fare clic sulle opzioni, quindi di richiedere loro un popup, di accettare di continuare e quindi di continuare a eseguire changeEvent o annullare changeEvent in base alla loro risposta al popup. –

risposta

4

Grazie a tutti per il vostro contributo. Quello che ho finito è stato salvare lo stato della selezione quando la casella di riepilogo si focalizza. E salvare questo indice e cambiarlo quando changeEvent si verifica solo cambiandolo alla selezione successiva, se consentito.

@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 

Questo viene eseguito utilizzando un uibinder, ma può anche essere fatto semplicemente aggiungendo questi eventi direttamente al listBox. Grazie ancora per i commenti!

1

Non c'è nulla di male nel consentire a ChangeEvent di continuare. È possibile aggiungere la propria logica al gestore di ChangeEvent. Se un utente decide di non procedere, è sufficiente impostare la selezione su quella precedente o rimuovere la selezione.

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

Si può semplicemente uccidere l'evento se non si vuole trattarlo:

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

Se uccidi l'evento, ripristinerà la selezione? –

+0

@AndreiVolgin Se si desidera annullare, aggiungere una variabile che manterrà il valore della selezione ad ogni modifica e quando non si desidera continuare, si uccide l'evento e si reimposta la selezione sull'ultimo valore nella variabile –

+0

@AdelBoutros Ho finito per archiviare il valore in un evento di messa a fuoco e di ricomporlo nell'evento di modifica. Non ho finito con l'uccisione dell'evento, ma ci penserò, grazie per i suggerimenti! –