如何接受触摸事件和鼠标事件以检测何时单击控件?

时间:2017-03-01 14:03:55

标签: eclipse swt

我制作了一个虚拟键盘,使用鼠标时效果很好。但是,我很难让它在触摸屏上正常工作。

对于正常操作,它可以正常工作。我按下屏幕并释放。这会引发MouseDown事件,然后发生MouseUp事件。没关系。

然后我想在一个按键上添加一个弹出按钮,通过按住500ms来触发该按键。使用鼠标这不是问题,但我现在看到触摸触发的鼠标事件仅在触发释放后上升。延迟后不可能触发弹出窗口。

接下来,我将TouchListener添加到虚拟键中,并认为问题已解决,直到我意识到鼠标事件仍然被提升导致2'键'按下 - 一个来自触摸,一个来自鼠标。

我想保持两个选项都打开,以便可以使用触摸屏或鼠标。所以我的问题是:如果我已经使用TouchListener处理了事件,如何防止引发鼠标事件?

(在Windows 10上使用带有Java7的eclipse kepler)

TouchListener touchListener = new TouchListener() {
    boolean down = false;
    @Override
    public void touch(TouchEvent e) {
        for (Touch t : e.touches) {
            if(t.primary) {
                if((t.state & SWT.TOUCHSTATE_DOWN) == SWT.TOUCHSTATE_DOWN) {
                    if(!down) {
                        down = true;
                        onKeyDown();
                    }
                }
                if((t.state & SWT.TOUCHSTATE_UP) == SWT.TOUCHSTATE_UP) {
                    if(down) {
                        down = false;
                        onKeyUp();
                    }
                }
            }
        }
    }
};
MouseAdapter mouseListener = new MouseAdapter() {
    @Override
    public void mouseDown(MouseEvent e) {
        onKeyDown();
    }

    @Override
    public void mouseUp(MouseEvent e) {
        onKeyUp();
    }
};

Label myKey = new Label(panel, 0);
myKey.setTouchEnabled(true);
myKey.addMouseListener(mouseListener);
myKey.addTouchListener(touchListener);

1 个答案:

答案 0 :(得分:0)

我认为最高处理这个问题是最容易的,作为去抖动。如果您在很短的时间内从一个键获得两个onKeyUp()事件,请忽略第二个。 (使用Event.time字段而不是处理事件的时间)