Domanda

Questa è probabilmente una cosa davvero semplice, ma non so come implementare quanto segue.

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.user.client.ui.AbsolutePanel;
import com.google.gwt.user.client.ui.Composite;

public class MousyAbsolutePanel extends Composite implements MouseDownHandler {

    AbsolutePanel abs = new AbsolutePanel();

    public MousyAbsolutePanel(int width){
        System.out.println("MousyAbsolutePanel being created with width:" + width);
        initWidget(abs);
        abs.setWidth(String.valueOf(width));
        abs.setHeight("100%");
        abs.setStyleName("mousyAbsolutePanel");
    }

    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

}

Voglio avere ciò che è effettivamente un absolutePanel in grado di accettare eventi del mouse. Tuttavia, all'interno dell'oggetto composito non so come legare il gestore che ho scritto (la cosa onMouseDown ()) con la variabile abs. Per dirla in breve, voglio che Abs AbsolutePanel risponda quando viene cliccato, ma AbsolutePanels non accetta naturalmente gli eventi click. Come posso fare per fare questo?

Mi scuso in anticipo se questo è stupido semplice, ma non so proprio come implementare questo comportamento e non l'ho visto menzionato nelle ricerche che ho fatto.

È stato utile?

Soluzione

In questo caso, l'estensione di Composite non è probabilmente la migliore idea a meno che tu non stia bloccando deliberatamente l'accesso all'AbsolutePanel che crei nel costruttore. Se estendi AbsolutePanel sarai in grado di riutilizzare il codice per aggiungere / rimuovere widget ecc.

Ecco come ti consiglierei di farlo:

package mods.client.resultSelector;

import com.google.gwt.event.dom.client.MouseDownEvent;
import com.google.gwt.event.dom.client.MouseDownHandler;
import com.google.gwt.event.dom.client.HasMouseDownHandlers;
import com.google.gwt.user.client.ui.AbsolutePanel;


public class MousyAbsolutePanel extends AbsolutePanel implements
                         MouseDownHandler,HasMouseDownHandlers {

    public MousyAbsolutePanel(int width) {
        System.out.println("MousyAbsolutePanel being created with width:" + width);

        this.setWidth(String.valueOf(width));
        this.setHeight("100%");
        this.setStyleName("mousyAbsolutePanel");

        this.addMouseDownHandler(this);
    }

    /** 
     * MouseDownHandler
     */
    public void onMouseDown(MouseDownEvent event) {
        System.out.println("onMouseDown()");
    }

    /**
     * HasMouseDownHandlers - Code to add handlers to the panel
     */  
    public HandlerRegistration addMouseDownHandler(MouseDownHandler handler) {
         return addDomHandler(handler, MouseDownEvent.getType());
    }

}

Quindi puoi accedere a MousyAbsolutePanel nello stesso modo in cui accedi a AbsolutePanel, ma con i gestori di eventi aggiuntivi, lo stile ecc.

Altri suggerimenti

Ecco un altro post che potrebbe essere utile:

Aggiunta di ClickHandler al div che contiene molti altri widget

Chiamare sinkEvents (Event.ONCLICK) e quindi aggiungere un ClickHandler usando solo addHandler ha funzionato benissimo per me.

La cosa migliore da fare per imparare come / cosa fare è guardare un esempio. Ad esempio, la classe FocusWidget (che implementa HasClickHandlers).

In particolare, osserva il metodo addClickHandler () e traccialo attraverso.

Dopo aver chiamato initWidget (Widget) , Composite eseguirà correttamente il proxy della registrazione dell'evento. Quindi, puoi semplicemente chiamare l'ereditato addDomHandler (...) di MousyAbsolutePanel .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top