Java swt更改了类型字符

时间:2011-08-13 12:35:48

标签: java events browser swt character

我有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;

的情况下以某种方式将角色更改为其他角色

3 个答案:

答案 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_numberarg0变量让我伤心。它使代码变得如此难以理解和模糊,试图避免它们;] ..

答案 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");
   }
}

对此代码的一些评论:

  1. 我们检查e.stateMask,因为我们仍然需要将CTRL + X保持为cut-function。请注意,如果您使用此代码而不是当前代码(只检查没有按下特殊按钮):

    if(e.character ==' x'&& e.stateMask == 0)

    启用CapsLock时会出现错误。在这种情况下,用户应按Shift + X以获得较低的x。

  2. 方法插入(" y")将字符插入光标所在位置。当选择一些文本时,整个选择将被" y"替换。

  3. 当前示例仅更改" 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;
}