2011-01-06 5 views

Respuesta

8

Según SWT: The Standard Widget Toolkit, Volumen 1, forceFocus():

Obliga al control a recibir teclado eventos. Los controles que normalmente no aceptan aceptar la entrada del teclado tomarán el foco usando este método. Si el foco no puede ser asignado por alguna razón, falso es devuelto.

también:

En términos generales, forzando enfoque es algo que nunca se quiere hacer. Por ejemplo, forzar el enfoque a una etiqueta no es muy útil porque las etiquetas no dibujan de una manera que indique que pueden aceptar entradas. Forzar el foco a un control que no lo espera puede confundir a los usuarios porque no tienen idea de donde van sus teclas. Los programas de aplicación siempre deben usar setFocus() para asignar el foco.

3

venir en forma tardía en este caso, pero acabo de terminar una sesión prolongada cabeza-golpeo-contra-pared en algo relacionado con esto y pensé en hacer un informe rápido:

Si su control tiene hijos, el setFocus(myControl) hará una búsqueda de profundidad en el árbol secundario y establecerá el foco en el primer hijo más bajo. Por otro lado, forceFocus(myControl) simplemente establecerá el foco en myControl y habrá terminado con él.

Tuve una situación con un diálogo no modal con un GridLayout, donde la mayoría de las celdas de la grilla eran un conjunto de objetos subcategorizados de Canvas que necesitaban enfoque. (Sí, esto es un poco extraño, pero quería poder desplazarme sobre una celda y escribir cosas en ella.) El último control en la cuadrícula era un botón "listo", que configuré como la selección predeterminada.

Cuando el mouse dejó las celdas del lienzo, estaba haciendo un setFocus(myDialogShell), que instantáneamente estableció el foco en el primer elemento del lienzo, evitando que el botón "done" reciba el \ r y deshacerse de todo el negocio sórdido. Por otro lado, forceFocus(myDialogShell) hizo el truco.

Cuestiones relacionadas