SWT: 发起事件 post event

简介: 有很多学习SWT的同志遇到过一类需求,为某些控件添加了诸如MouseListener、KeyListener之类的监听,然后呢,希望使用代码模拟鼠标、键盘来执行点击、按键等操作。 首先说明一点,这是可以实现的,但是99%的需求都不应该这样实现。

有很多学习SWT的同志遇到过一类需求,为某些控件添加了诸如MouseListener、KeyListener之类的监听,然后呢,希望使用代码模拟鼠标、键盘来执行点击、按键等操作。

首先说明一点,这是可以实现的,但是99%的需求都不应该这样实现。

在继续往下看之前,请你考虑一点,你是不是可以把监听中的逻辑代码抽离出来,做成单独的可供调用的功能块,在你希望“模拟”的地方调用它。

 

 

如果实在考虑不出更好的方式,请往下看。

解决方案很简单:

 

                Event ex = new Event();
                ex.widget = targetWidget;
                ex.type = SWT.KeyDown;
                ex.button = 1;
                Display.getCurrent().post(ex);

自己构建一个事件,为该事件指定一个控件目标,然后发起它。

 

那么,如此简单的代码,为什么你还需要搜索呢?

这里说说,在对发起事件无甚了解又不想看API的情况下的解决思路。

 

1、为任意控件添加一个监听,打断点,触发它

通过这个步骤,我们可以看出,事件Event都是通过Display的readAndDispatch方法进行调度分发的。

 

2、读到runDeferredEvents方法中,可以观察到eventQueue事件队列,你应该能敏感的察觉到你需要往这里面添加Event,才有可能发起事件

 

3、ctrl+shift+G搜索eventQueue在Display里的使用,可以观察到sentEvent、postEvent等等方法,先不要看源码,ctrl+o,可以看出,Display对外提供了一个post(Event)方法

 

4、那么,调用post就可以了么?我们再来看看步骤2位置,阅读以下源码:

/* Run the event */
        Widget widget = event.widget;
        if (widget != null && !widget.isDisposed ()) {
            Widget item = event.item;
            if (item == null || !item.isDisposed ()) {
                run = true;
                widget.sendEvent (event);
            }
        }

可以看出,充要条件是event必须具备一个未被disposed的widget。

以上,即可得出早前的解决方案。

 

目录
相关文章
|
9月前
|
存储 Cloud Native 程序员
C++ Qt 事件(event)
C++ Qt 事件(event)
|
2月前
|
UED
event事件
event事件
20 1
|
3月前
|
开发者
移动端 click 事件、touch 事件、tap 事件的区别
移动端 click 事件、touch 事件、tap 事件的区别
22 1
|
Java Android开发 C++
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
Framework 全局监听屏幕点击事件 INPUT_EVENT_INJECTION
271 0
|
C#
C# 事件(Event)
C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键、点击、鼠标移动等等,或者是一些提示信息,如系统生成的通知。应用程序需要在事件发生时响应事件。例如,中断。 C# 中使用事件机制实现线程间的通信
169 0
|
C++
C++ 事件(event)使用总结
C++ 事件(event)使用总结
1324 0
C++ 事件(event)使用总结
|
容器 C# 安全
事件(Event)
事件(Event) 事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其他的程序逻辑触发的。引发事件的对象称为事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
740 1
VBS调用keybd_event事件
----------------发送alt+v组合按键----------------------Set Wrap = CreateObject("DynamicWrapper") Wrap.Register "USER32.
1092 0