我有swt浏览器小部件,用户可以使用键盘输入,我需要某些角色用户按下更改给其他人。 例如,当用户按x时,我将其更改为y。
我添加了关键监听器,我可以使用doit = false阻止用户输入; 但现在我无法传递我的角色。
这是我正在做的事情:
browser_1.addListener(SWT.KeyDown, new Listener() {
public void handleEvent(Event arg0) {
if(arg0.character=='x')
{
arg0.doit=false;
//now here how to send y as a charachter to browser widget
}
}
});
换句话说,我可以在不使用arg0.doit = false;
的情况下以某种方式将角色更改为其他角色答案 0 :(得分:4)
所以经过一些搜索,这是解决方案
在SWT中,您可以添加显示“过滤器”监听器实例,该实例可以修改事件中的任何内容(请参阅docs for details)。
来自Javadoc的注意事项: 可以使用handleEvent()方法中的事件类型设置SWT.None来更改事件类型并停止后续Java侦听器的运行。由于事件过滤器在其他侦听器之前运行,因此事件过滤器可以阻止其他侦听器并在事件中设置任意字段。因此,事件过滤器既强大又危险。出于性能,调试和代码维护的原因,通常应避免使用它们。
这是代码(将任何类型的键更改为'l'
字符,并在事件实际出现时在控制台中写入)
browser.addListener(SWT.KeyDown, new Listener() {
public void handleEvent(Event event) {
System.out.println(event.character);
}
});
display.addFilter(SWT.KeyDown, new Listener() {
public void handleEvent(Event event) {
if(event.widget instanceof Browser) {
event.character = 'l';
}
}
});
恕我直言,这是非常糟糕的解决方案,在浏览器端(通过JavaScript)实现更漂亮
当我正在寻找你的代码时(不知道它是否只是一些测试,概念验证代码),使用something_number
或arg0
变量让我伤心。它使代码变得如此难以理解和模糊,试图避免它们;] ..
答案 1 :(得分:2)
您可以执行以下操作:
Text textControl = new Text(...);
textControl.addKeyListener(this);
...
public void keyPressed(KeyEvent e) {
if (e.character == 'x' && (e.stateMask & SWT.CONTROL) == 0) {
e.doit = false;
textControl.insert("y");
}
}
对此代码的一些评论:
我们检查e.stateMask,因为我们仍然需要将CTRL + X保持为cut-function。请注意,如果您使用此代码而不是当前代码(只检查没有按下特殊按钮):
if(e.character ==' x'&& e.stateMask == 0)
启用CapsLock时会出现错误。在这种情况下,用户应按Shift + X以获得较低的x。
方法插入(" y")将字符插入光标所在位置。当选择一些文本时,整个选择将被" y"替换。
当前示例仅更改" x"的小写字母。如果需要处理也应该更改它,也可以将上面的X改为Y.
答案 2 :(得分:0)
我有类似的要求:将键盘上的小数点分隔符(点)转换为我们语言环境的小数分隔符(逗号)。我尝试了与Sorceror相同的想法,但它对我也没有用。什么工作是设置event.doit = false并发布一个新事件,该事件是原始事件的克隆,并替换了该字符:
@Override
public void handleEvent(Event event) {
if (event.widget instanceof Browser && event.character == 'x') {
Event eventClone = cloneEvent(event);
eventClone.character = 'y';
event.doit = false;
display.post(eventClone);
}
}
(如果显示是局部变量,则需要将其设为最终。) 我创建了一个小实用程序方法来创建事件的克隆:
/**
* @return a clone of the given {@link Event}
*/
public static Event cloneEvent(Event event) {
Event clone = new Event();
clone.display = event.display;
clone.widget = event.widget;
clone.type = event.type;
clone.detail = event.detail;
clone.item = event.item;
clone.index = event.index;
clone.gc = event.gc;
clone.x = event.x;
clone.y = event.y;
clone.width = event.width;
clone.height = event.height;
clone.count = event.count;
clone.time = event.time;
clone.button = event.button;
clone.character = event.character;
clone.keyCode = event.keyCode;
clone.keyLocation = event.keyLocation;
clone.stateMask = event.stateMask;
clone.start = event.start;
clone.end = event.end;
clone.text = event.text;
clone.doit = event.doit;
clone.data = event.data;
clone.touches = event.touches;
clone.xDirection = event.xDirection;
clone.yDirection = event.yDirection;
clone.magnification = event.magnification;
clone.rotation = event.rotation;
return clone;
}