2017-07-12 1 views
0

Est-il possible de gérer les événements MouseDown/MouseUp et KeyDown/KeyUp avec Vaadin? J'ai trouvé forum thread avec la même question et on dirait que la réponse est non, mais c'était il y a 5 ans - j'espère que quelque chose a changé avec les versions ultérieures. Pourtant, je ne trouve rien dans l'API. Peut-être qu'il y a une solution pour intercepter de tels événements?Vaadin: MouseDown/MouseUp et KeyDown/KeyUp est

+0

Quelle version de Vaadin utilisez-vous, et pour quels composants vous souhaitez ajouter des écouteurs à la souris et à la clé? – Morfic

+0

C'est possible. – petey

+0

@Morfic, 8.1.0.beta1, Composant arbre. –

Répondre

1

Eh bien, après quelques jours, j'ai trouvé la solution acceptable (pour moi). Le composant requis doit être enveloppé avec extension-interceptor (crédits à @petey pour une idée dans les commentaires) avec KeyDownHandler à l'intérieur. Mais l'astuce est de ne pas ajouter au composant lui-même (car il peut manquer de déclenchement), mais à laRootPanel. Alors, voici un exemple de travail.

Extension:

public class InterceptorExtension extends AbstractExtension { 

    private boolean shiftKeyDown; 

    public InterceptorExtension(Tree tree) { 
     super.extend(tree); 
     registerRpc((InterceptorExtensionServerRpc) state -> shiftKeyDown = state); 
    } 

    public boolean isShiftKeyDown() { 
     return shiftKeyDown; 
    } 

} 

ServerRpc:

public interface InterceptorExtensionServerRpc extends ServerRpc { 

    void setShiftKeyDown(boolean state); 

} 

Connecteur:

@Connect(InterceptorExtension.class) 
public class InterceptorExtensionConnector extends AbstractExtensionConnector { 

    @Override 
    protected void extend(final ServerConnector target) { 
     final InterceptorExtensionServerRpc rpcProxy = getRpcProxy(InterceptorTreeExtensionServerRpc.class); 
     final RootPanel rootPanel = RootPanel.get(); 
     rootPanel.addDomHandler(new KeyDownHandler() { 
      @Override 
      public void onKeyDown(KeyDownEvent event) { 
       if (event.isShiftKeyDown()) { 
        rpcProxy.setShiftKeyDown(true); 
       } 
      } 
     }, KeyDownEvent.getType()); 
     rootPanel.addDomHandler(new KeyUpHandler() { 
      @Override 
      public void onKeyUp(KeyUpEvent event) { 
       if (!event.isShiftKeyDown()) { 
        rpcProxy.setShiftKeyDown(false); 
       } 
      } 
     }, KeyUpEvent.getType()); 
    } 

} 

Ensuite, chaque fois que vous voulez, vous pouvez obtenir l'état Shift-bouton sur le côté serveur via InterceptorExtension # isShiftKeyDown.