2009-08-06 11 views
21

Ho creato un widget personalizzato in gwt che estende il composito.Sto utilizzando il pannello di messa a fuoco in questo.Per FocusPanel ho aggiunto ClickHandler.Poi ho aggiunto il listener della tastiera.Ora alla pressione del tasto Invio dovrebbe attivare l'evento click. Qualcuno mi aiuta ad attivare l'evento click utilizzando il codice in GWT?Attivazione evento click dal codice in gwt

focusPanel.addKeyPressHandler(new KeyPressHandler() { 
      public void onKeyPress(KeyPressEvent event) { 
       if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)  { 
        // TODO call onClick() method 
       } 
      } 
     }); 

Grazie

risposta

18

Non l'ho fatto per un evento click, ma ho modificato eventi come questo.

NativeEvent event = Document.get().createChangeEvent(); 
DomEvent.fireNativeEvent(event, this); 

Il [createClickEvent] (http://google-web-toolkit.googlecode.com/svn/javadoc/1.6/com/google/gwt/dom/client/Document.html#createClickEvent(int,%20int,%20int,%20int,%20int,%20boolean,%20boolean,%20boolean,%20boolean)) metodo prende molto più parametri però.

public final NativeEvent createClickEvent(int detail, 
              int screenX, 
              int screenY, 
              int clientX, 
              int clientY, 
              boolean ctrlKey, 
              boolean altKey, 
              boolean shiftKey, 
              boolean metaKey) 
2

Il metodo descritto da DLH dovrebbe funzionare e fatta eccezione per l'argomento particolare (che non ho idea di che cosa è per avete gli altri argomenti disponibili su KeyPressEvent

Un'altra soluzione possibile è chiamare il codice JavaScript nativo click() sull'elemento. L'ho fatto in un widget Button (che è disponibile come op en source). Vedere il metodo click() nella seguente classe: http://code.google.com/p/cobogw/source/browse/trunk/widgets/src/main/java/org/cobogw/gwt/user/client/ui/Button.java), che chiama una classe Event2 specifica, che implementa le versioni specifiche del browser del metodo click.

Per utilizzare questo metodo, si potrebbe semplicemente aggiungere il file jar fornito con cobogw al progetto, includere il Event.gwt.xml e chiamare Event2.fireClickEvent(getElement()); nel metodo o utilizzare solo il codice dalle classi Event2 e eventi nel proprio progetto

Questa soluzione consente inoltre di generare un evento click in modo programmatico.

Dai un'occhiata all'implementazione onBrowserEvent nella classe Button menzionata sopra, poiché gestisce l'evento chiave in un modo simile a quello desiderato e risolve il problema dello sparo di più eventi chiave, quando si desidera solo generare un evento di clic.

20

ho fatto questo codice:

if (event.getNativeEvent().getKeyCode() == KeyCodes.KEY_ENTER)  { 
    myButton.fireEvent(new GwtEvent<ClickHandler>() { 
     @Override 
     public com.google.gwt.event.shared.GwtEvent.Type<ClickHandler> getAssociatedType() { 
     return ClickEvent.getType(); 
     } 
     @Override 
     protected void dispatch(ClickHandler handler) { 
      handler.onClick(null); 
     } 
    }); 
} 

Ovviamente myButton deve essere definitivo o pubblico perché ci si trova all'interno di un altro gestore di eventi.

+1

Credo che sia la risposta corretta come fa il lavoro. Tuttavia, questo è un sacco di codice piastra della caldaia per un piccolo effetto. Si spera che un giorno Google includerà questo direttamente nell'automazione di test GWT. – Sebi

+0

Grazie mille. Per me funziona. –

+0

funziona per il pulsante ma non funziona per la barra dei menu. :( – knocker

14

È anche possibile utilizzare un semplice metodo JSNI per farlo. Passa il tuo elemento [ad es. button.getElement()] a questo metodo:

public static native void clickElement(Element elem) /*-{ 
    elem.click(); 
}-*/; 
+1

funziona con il pulsante ma non funziona con la barra dei menu. :( – knocker

2

Se il bersaglio è un pulsante si può chiamare il suo metodo click().In caso contrario, si può fare qualcosa di simile:

private void click(HasHandlers handlerSource) { 
    NativeEvent event = Document.get().createClickEvent(0, 0, 0, 0, 0, false, false, false, false); 
    DomEvent.fireNativeEvent(event, handlerSource); 
} 
0

Si può solo fare questo:

focusPanel.fireEvent(new ClickEvent(){}); 
+0

'ClickEvent()' ha accesso protetto in 'com.google.gwt.event.dom .client.ClickEvent ' –

+0

@GlenPierce Correggere, ma non si sta chiamando il suo costruttore protetto, si sta creando una nuova classe interna anonima e si sta utilizzando il suo costruttore. Provate il codice, vedrete che si compila bene. – Craigo