Is Display.addFilter(...) the best way to add a glbal shortcut? I tried Display.addListener(...) but this didn't receive any events at all.
Sí, normalmente Display.addFilter(...)
es la mejor manera de añadir un acceso directo glbal porque tienen mayor preferencia sobre los detectores de eventos. Mira el siguiente comentario de Display.addFilter(...)
javadoc.
debido a los filtros de eventos se ejecutan antes otros oyentes, filtros de eventos pueden ambos bloques otros oyentes y establecer campos arbitrarios dentro de un evento. Para esta razón, los filtros de eventos son ambos potentes y peligrosos. Deberían evitarse generalmente por rendimiento, depuración y mantenimiento de código razones.
Para su segunda pregunta:
Why don't I get the pressed character when I'm holding down ctrl? When I hold down alt or shift I get the expected mask and the pressed character.
El problema es que usted está buscando en el lugar equivocado. En lugar de consultar e.character
, debe usar e.keyCode
. Según javadoc de e.character
usted no conseguirá solo carácter f
:
Dependiendo del caso, el carácter representado por la tecla que se ha escrito. Este es el carácter final que resultados después de que se hayan aplicado todos los modificadores .Por ejemplo, cuando el usuario escribe Ctrl + A, el valor del carácter es 0x01 (ASCII SOH).
Así que cuando se presiona CTRL + f entonces se convierte en 0x06
(ASCII ACK). Lo cual no es el caso cuando se hace ALT +foSHIFT +f.
Por otro lado, el javadoc de e.keyCode
dice:
dependiendo del caso, el código de la llave de la tecla que se ha escrito, tal como se define por las constantes del código en la clase SWT. Cuando el campo de caracteres del evento es ambiguo, este campo contiene el valor no afectado del carácter original . Por ejemplo, escribiendo Ctrl + M o Intro ambos resultados en el carácter '\ r' pero el campo claveCódigo también contendrá '\ r' cuando se escribió Enter y 'm' cuando se tipeó Ctrl + M .
Compruebe el código a continuación para obtener más detalles. Para la demostración, he intentado poner listener en Display
y Test
.
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
public class ControlF
{
public static void main(String[] args)
{
Display display = new Display();
final Shell shell = new Shell (display);
final Color green = display.getSystemColor (SWT.COLOR_GREEN);
final Color orig = shell.getBackground();
display.addFilter(SWT.KeyDown, new Listener() {
public void handleEvent(Event e) {
if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f'))
{
System.out.println("From Display I am the Key down !!" + e.keyCode);
}
}
});
shell.addKeyListener(new KeyListener() {
public void keyReleased(KeyEvent e) {
if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f'))
{
shell.setBackground(orig);
System.out.println("Key up !!");
}
}
public void keyPressed(KeyEvent e) {
if(((e.stateMask & SWT.CTRL) == SWT.CTRL) && (e.keyCode == 'f'))
{
shell.setBackground(green);
System.out.println("Key down !!");
}
}
});
shell.setSize (200, 200);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
Esta fue una respuesta excelente: ahora tengo mi atajo funcionando. ¡Gracias! Trataré de leer los documentos mejor la próxima vez. – mchr
Eso resolvió mi problema también, ¡gracias por la clara explicación! +1 –
¿cómo podemos anular el atajo del sistema como ctrl + c agregando un filtro como este? – Fahad