mch*_*chr 10 java swt keyboard-shortcuts event-handling
我编写了一个SWT UI,它具有在StyledText控件中显示文本的主要功能.我想为Ctrl+ 添加一个处理程序,F以便在按下该快捷键时将焦点设置为搜索框.我尝试使用以下代码来检测按键.
sWindow = new Shell();
...
sWindow.getDisplay().addFilter(SWT.KeyDown, new Listener()
{
@Override
public void handleEvent(Event e)
{
System.out.println("Filter-ctrl: " + SWT.CTRL);
System.out.println("Filter-mask: " + e.stateMask);
System.out.println("Filter-char: " + e.character);
}
});
Run Code Online (Sandbox Code Playgroud)
我期待当我按下Ctrl+时f会看到以下输出:
Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: f
Run Code Online (Sandbox Code Playgroud)
但是,在实践中我实际上看到以下内容.
Filter-ctrl: 262144
Filter-mask: 262144
Filter-char: <unprintable char - displayed as a box in eclipse console>
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
Fav*_*ius 31
Is Display.addFilter(...) the best way to add a glbal shortcut? I tried Display.addListener(...) but this didn't receive any events at all.
是的,通常Display.addFilter(...)是添加glbal快捷方式的最佳方式,因为它们对事件侦听器具有更高的偏好.请参阅Display.addFilter(...)javadoc 的以下评论.
由于事件过滤器在其他侦听器之前运行,因此事件过滤器可以阻止其他侦听器并在事件中设置任意字段.因此,事件过滤器既强大又危险.出于性能,调试和代码维护的原因,通常应避免使用它们.
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.
问题是你在找错了地方.而不是查询e.character你应该使用e.keyCode.根据javadoc,e.character你不会得到正好的角色f:
根据事件,键入的键所代表的字符.这是应用所有修改器后生成的最终字符.例如,当用户键入Ctrl + A时,字符值为0x01(ASCII SOH).
所以当你按CTRL+ f然后它转换为0x06(ASCII ACK).当你做ALT+ f 或 SHIFT + 时不是这种情况f.
另一方面,javadoc e.keyCode说:
取决于事件,键入的键的键代码,由类SWT中的键代码常量定义.当事件的字符字段不明确时,此字段包含原始字符的未受影响的值.例如,键入Ctrl + M或Enter两者都会产生字符'\ _ \',但keyCode字段在输入Enter时也会包含'\ r',而在键入Ctrl + M时也会包含'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 ();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20677 次 |
| 最近记录: |