2010-07-06 11 views
25

Desidero aggiornare immediatamente un campo di testo quando si digita in un GWT TextBox. Il mio problema è che i gestori ValueChangeEvent e ChangeEvent si attivano solo quando il TextBox perde lo stato attivo. Ho pensato di usare KeyPressEvent ma poi non succederà nulla quando eseguo una copia incolla con il mouse.Gestore di modifica del valore istantaneo su una casella di testo GWT

Qual è il modo più semplice per farlo?

risposta

32

È possibile rilevare l'evento ONPASTE e attivare manualmente un ValueChangeEvent. Qualcosa del genere:

public void onModuleLoad() { 
    final Label text = new Label(); 
    final ExtendedTextBox box = new ExtendedTextBox(); 
    box.addValueChangeHandler(new ValueChangeHandler<String>() { 

     @Override 
     public void onValueChange(ValueChangeEvent<String> event) { 
      text.setText(event.getValue()); 
     } 

    }); 
    box.addKeyUpHandler(new KeyUpHandler() { 

     @Override 
     public void onKeyUp(KeyUpEvent event) { 
      text.setText(box.getText()); 
     } 
    }); 

    RootPanel.get().add(box); 
    RootPanel.get().add(text); 
} 

private class ExtendedTextBox extends TextBox { 

    public ExtendedTextBox() { 
     super(); 
     sinkEvents(Event.ONPASTE); 
    } 

    @Override 
    public void onBrowserEvent(Event event) { 
     super.onBrowserEvent(event); 
     switch (DOM.eventGetType(event)) { 
      case Event.ONPASTE: 
       Scheduler.get().scheduleDeferred(new ScheduledCommand() { 

        @Override 
        public void execute() { 
         ValueChangeEvent.fire(ExtendedTextBox.this, getText()); 
        } 

       }); 
       break; 
     } 
    } 
} 

Testato su firefox 3.6.1.

+1

Grazie. Questo ha funzionato per me. Una cosa che gli altri possono notare è che il comando posticipato è richiesto perché il TextBox non contiene ancora il testo di interesse quando viene gestito l'evento paste. Se si sta tentando di filtrare il contenuto della casella di testo (nel mio caso, per i caratteri validi), si noti che un utente vedrà momentaneamente il testo incollato. Qualcuno conosce qualche modo per aggirare questo? Da quello che ho letto, FF non consente l'ispezione degli appunti, ma sia IE che Webkit lo fanno? – ShabbyDoo

+0

Quello che si potrebbe fare è nascondere il contenuto di 'TextBox' fino a quando non viene effettuata la convalida. È davvero un trucco ma 'color: transparent' farebbe il trucco ... – z00bs

+0

@ z00bs È possibile fare a meno di estendere TextArea e usare UiBinder? – alexandroid

0

Perché non utilizzare la combinazione di KeyUpHandler e ChangeHandler sul TextBox? Dovrebbe occuparsi di un riscontro immediato su ogni sequenza di tasti così come sul caso di copia incolla.

+0

Come ho detto, ChangeHandler si attiva solo quando il TextBox perde l'attenzione ma vorrei aggiornare il mio campo all'istante (mentre l'utente sta digitando). – Jla

+0

Hmmm ... Hai trovato un modo? Si prega di condividere la soluzione quando si fa :) Grazie –

+0

Il cambiamento di comportamento sulla perdita di messa a fuoco è stato accettato, dopo tutto, per l'app su cui stavo lavorando. Quindi non ho mai trovato una soluzione e l'ho lasciata da parte per il momento. Ma aggiornerò la domanda se mai la trovo. – Jla

1

Questo è stato un grosso problema per me in passato. Il keyupHandler non funzionerà perché la copia incolla richiede una seconda pressione del tasto sull'opzione incolla che non attiva l'evento. il meglio che sono stato in grado di fare è usare il vecchio changelistener non ideale, ma funziona.

+0

Inoltre, la copia incolla può essere eseguita con il mouse. – Jla

+1

Meglio usare l'evento di input, ma non sono sicuro di come accedervi da gwt. Gestisce sia l'incolla che la tastiera, mentre si alza quando il valore cambia effettivamente.https://developer.mozilla.org/en/DOM/DOM_event_reference/input –

0
Just saw this question. Because I was facing the similar problem. 

Ho fatto qualche hack e ha funzionato per me. È possibile utilizzare KeyUpHandler ma utilizzarlo con un blocco aggiuntivo if che verifica per la lunghezza della casella di testo. Se la lunghezza della casella di testo è> 0, fai le tue cose. Es:

textBox.addKeyUpHandler(new KeyUpHandler() { 
    @Override 
    public void onKeyUp(KeyUpEvent keyUpEvent) { 
    if (textBox.getText().length() > 0) { 
    //do your stuff`enter code here` 

    } 
    } 
+0

Questo non tiene conto del trascinamento dei valori nella casella, attiva anche i trigger di sinistra/destra, ctrl keyrelease – WORMSS

+0

vero, questo sarà applicabile per la digitazione che include il testo. Immagino che servirà allo scopo di questa domanda. È solo un trucco;) –

1

Come una soluzione generale, ciò che funziona per me (thx a Gal-Bracha commento):

In generale, GWT non ha classi per gestire eventi di input (descritto here e here) . Quindi abbiamo bisogno per la sua attuazione da noi stessi:

Handler classe: class

import com.google.gwt.event.shared.EventHandler; 

public interface InputHandler extends EventHandler { 

    void onInput(InputEvent event); 

} 

evento:

import com.google.gwt.event.dom.client.DomEvent; 

public class InputEvent extends DomEvent<InputHandler> { 

    private static final Type<InputHandler> TYPE = new Type<InputHandler>("input", new InputEvent()); 

    public static Type<InputHandler> getType() { 
     return TYPE; 
    } 

    protected InputEvent() { 
    } 

    @Override 
    public final Type<InputHandler> getAssociatedType() { 
     return TYPE; 
    } 

    @Override 
    protected void dispatch(InputHandler handler) { 
     handler.onInput(this); 
    } 

} 

Usage:

box.addDomHandler(new InputHandler() { 

    @Override 
    public void onInput(InputEvent event) { 
     text.setText(box.getText()); 
    } 
},InputEvent.getType()); 

Funziona su ogni modifica del valore TextBox compreso incollare utilizzando il menu di scelta rapida. Non reagisce su frecce, ctrl, shift ecc ...

+0

Mancante "(" dopo il nuovo tipo . – Alicia

+0

Risolto, thx @Alicia – zolv

+0

Viene visualizzato questo errore durante la creazione: eccezione 2 (Stringa): tentativo di eseguire il sink dell'ingresso del tipo di evento sconosciuto –

Problemi correlati