【发布时间】:2015-12-01 10:18:28
【问题描述】:
我在理解 SWT 中的关键事件时遇到了一些麻烦。我的程序在 Windows 8.1 + Java 8 下运行。
例如我有一个文本字段并尝试处理 KeyUp:
textField.addListener(SWT.KeyUp, new Listener() {
@Override
public void handleEvent(Event e) {
}
});
在 handleEvent 方法中,我将 e.doit 设置为 false,然后尝试区分箭头键、空格键或 ALT + 字母等的某些组合。
我有点疑惑,因为我的应用程序执行的任务不正确。于是我调试了coe,发现handleEvent方法每次都用不同的事件对象执行了3次。
这不好,因为在这种情况下,几乎不可能让它以预期的方式工作 - 每个调用都可以替换 f.e.上一次调用的属性值。
而且不知道是什么原因:我按了一个键,handler方法被调用了3次。为什么?这对我来说有点不合逻辑......
+++ 已编辑 +++
package mytest;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Main {
private static int i = 0;
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
Text textField = new Text(shell, SWT.BORDER | SWT.READ_ONLY | SWT.SINGLE);
textField.addListener(SWT.KeyUp, new Listener() {
@Override
public void handleEvent(Event e) {
e.doit = false;
System.out.println("Call #" + (++i) + ": keyCode=" + e.keyCode);
}
});
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
您可以运行这个小示例,然后按 f.e。 ALT+A、CTRL+I 或 ARROW_DOWN,您会看到每次按下都会经常调用句柄方法,这不是我对按键监听器的期望!
【问题讨论】:
-
这不是我在快速测试中看到的。您需要向我们展示Minimal, Complete, and Verifiable example
-
好的,我贴了一个小代码示例来演示这个问题;请记住,我在 Windows 下运行它。
-
在我的 Mac 上,我看到了两个事件,这是我所期望的 - 每个键都被释放。
-
@greg: 不。例如,如果我按 CTRL+o,那么我希望在 e.stateMask 中找到 SWT.CTRL,在同一事件对象中的 e.keyCode 中找到 'o' char。这就是为什么我希望调用一次处理程序方法,而不是两次或三次左右。否则我必须将每个方法调用的关键代码组合在一个全局变量中以获得完整的快捷方式,这会很奇怪。
-
如果我的回答与您的期望不符,请提供您所看到的准确输出以及输入内容。提供minimal reproducible example 代码非常有用,接下来要明确输入和输出。
标签: java swt keylistener