Is Display.addFilter(...) the best way to add a glbal shortcut? I triedDisplay.addListener(...) but this didn't receive any events at all.
是的,通常
Display.addFilter(...)是添加全局快捷方式的最佳方法,因为它们比事件侦听器具有更高的优先级。请参见
Display.addFilter(...)javadoc中的以下注释。
因为事件过滤器在其他侦听器之前运行,所以事件过滤器既可以阻止其他侦听器,又可以在事件内设置任意字段。因此,事件过滤器既强大又危险。出于性能,调试和代码维护的原因,通常应避免使用它们。
对于第二个问题:
Why don't I get the pressed character when I'm holding down ctrl? When Ihold down alt or shift I get the expected mask and the pressed character.
问题是您在看错地方。而不是查询,
e.character您应该使用
e.keyCode。根据
e.character您的javadoc,您将不会只得到字符
f:
根据事件,由键入的键表示的字符。这是在应用所有修饰符后得出的最终字符。例如,当用户键入Ctrl + A时,字符值为0x01(ASCII SOH)。
因此,当您按
CTRL+时,
f它将转换为
0x06(ASCII ACK)。当您使用
ALT+
f或
SHIFT+
时,情况并非如此
f。
另一方面,javadoc
e.keyCode表示:
根据事件,所键入的密钥的密钥代码,由类SWT中的密钥代码常量定义。当事件的字符字段不明确时,该字段将包含原始字符的不受影响的值。例如,键入Ctrl +
M或Enter都输入字符’ r’,但键入Enter时keyCode字段也将包含’ r’,而键入Ctrl + M时keyCode字段还将包含’m’。
检查下面的代码以获取更多详细信息。对于演示,我尝试将监听器置于
Display和
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 (); }}


