¿Cómo adjunto un controlador de eventos al documento o ventana en GWT?

En una aplicación de GWT centrada en un lienzo, tengo problemas para mantener el enfoque en el lugar correcto, especialmente para los atajos de teclado. Por ahora, he envuelto el lienzo en un FocusPanel, pero eso hace que el lienzo no responda al protocolo RequireResize, porque FocusPanel no lo hace.

Un segundo problema (relacionado, creo) es que FocusPanel no recibe ningún evento de pulsación de tecla Ctrl-A (probado en Mac Chrome). Puedo obtener Ctrl-Z y otras teclas (como flechas) muy bien.

En un mundo de JavaScript puro, creo que la mejor respuesta a esto sería adjuntar el mouse y los controladores de teclas al documento o al objeto de la ventana (no estoy seguro de cuál es mejor). Sin embargo, no veo una forma obvia de hacer esto en GWT; en particular, las clases Documento y Ventana carecen de métodos para adjuntar este tipo de controladores de eventos.

¿Alguien sabe cómo hacerlo o, quizás, cómo resolver el problema más general de mantener el foco en un widget apropiado capaz de manejar atajos de teclado?

preguntado el 08 de enero de 11 a las 22:01

1 Respuestas

Puede resolver su primer problema ampliando FocusPanel para implementar las interfaces RequiresResize y ProvidesResize:

public class ResizingFocusPanel
  extends FocusPanel
  implements RequiresResize, ProvidesResize
{
  public ResizingFocusPanel() {}

  public ResizingFocusPanel(Widget child) {
    super(child);
  }

  @Override
  public void onResize() {
    if (getWidget() instanceof RequiresResize) {
      ((RequiresResize)getWidget()).onResize();
    }
  }
}

Respondido el 09 de enero de 11 a las 09:01

Esto corrige mi cambio de tamaño (excepto que necesitaba el constructor nular para poder usar el enlazador XML). Experimenté un poco con JavaScript sin procesar, y creo que probablemente tenga que presionar la tecla en lugar de simplemente presionar la tecla para obtener los eventos Ctrl-A, incluso cuando estoy adjuntando una ventana o un documento. Así que creo que esto es lo mejor que puedo hacer por ahora. ¡Gracias! - Raph Levien

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.