编辑器区域多键事件无法正常工作的原因排查
问题:Editor中CTRL+V组合键在SWT全局过滤器中无法正常捕获?
我编写了如下SWT全局键盘事件过滤器代码,用来捕获按键组合:
display.addFilter(SWT.KeyDown, new Listener() { @Override public void handleEvent(Event event) { String string = ""; System.out.println("statemask: " + event.stateMask); System.out.println("keycode " + event.keyCode ); //check click together? if ((event.stateMask & SWT.ALT) != 0) string += "ALT - keyCode = " + event.keyCode; if ((event.stateMask & SWT.CTRL) != 0) string += "CTRL - keyCode = " + event.keyCode; if ((event.stateMask & SWT.SHIFT) != 0) string += "SHIFT - keyCode = " + event.keyCode; if(event.keyCode == SWT.BS) { string += "BACKSPACE - keyCode = " + event.keyCode; } if(event.keyCode == SWT.ESC) { string += "ESCAPE - keyCode = " + event.keyCode; } //check characters if(event.keyCode >=97 && event.keyCode <=122) { string += " " + event.character + " - keyCode = " + event.keyCode; } //check digit if(event.keyCode >=48 && event.keyCode <=57) { string += " " + event.character + " - keyCode = " + event.keyCode; } System.out.println("Test"); if(!string.equals("")) System.out.println (string); } });
现象
- 当焦点在View中按下CTRL+V等组合键时,输出正常:
CTRL - keyCode = 118 - keyCode = 118
- 但焦点在Editor中按下CTRL+V时,
stateMask为0且第二个按键被忽略。
原因分析
这是因为Eclipse的Editor(比如文本编辑器)会优先处理标准编辑快捷键(如CTRL+V、CTRL+C等),处理时会调用event.doit = false终止事件传播,导致全局SWT KeyDown过滤器无法接收到完整事件信息。
具体细节:
- Editor内部的快捷键逻辑会先于全局过滤器触发,识别到CTRL+V这类标准操作时,会直接执行粘贴动作,同时阻止事件继续向上传递。
- 此时全局过滤器收到的事件已被修改,
stateMask被重置,后续按键事件也被拦截,因此看不到预期输出。
解决思路
- 给目标Editor注册局部KeyListener,局部监听器优先级通常高于Editor内部的快捷键处理(可根据注册顺序调整)。
- 通过Eclipse的
IHandlerService注册全局命令,将CTRL+V绑定到自定义命令,覆盖默认粘贴行为(需注意避免影响正常编辑)。
内容的提问来源于stack exchange,提问作者Elena Larina
相关产品推荐
相关产品推荐

