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。

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

 

目录
相关文章
|
Docker 容器
Gitlab - 解决访问 gitlab 网站出现 502 报错信息的问题
Gitlab - 解决访问 gitlab 网站出现 502 报错信息的问题
904 0
Gitlab - 解决访问 gitlab 网站出现 502 报错信息的问题
|
消息中间件 分布式计算 算法
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析(上)
深入理解Zookeeper系列-3.Zookeeper实现原理及Leader选举源码分析
956 0
|
存储 JavaScript 前端开发
js实现灵活下载和预览网络链接pdf文件
js实现灵活下载和预览网络链接pdf文件
1229 0
|
12月前
|
算法
Leetcode第46题(全排列)
这篇文章介绍了LeetCode第46题“全排列”的解题方法,使用深度优先搜索(DFS)和回溯算法来生成给定数组的所有可能排列。
152 0
Leetcode第46题(全排列)
|
机器学习/深度学习 人工智能 Serverless
【深度学习】神经网络中的激活函数:释放非线性的力量
【深度学习】神经网络中的激活函数:释放非线性的力量
437 1
|
并行计算 算法 Java
Java 中的 fork-join 框架详解
【8月更文挑战第23天】
219 0
|
机器学习/深度学习 监控 算法
|
Java API 开发者
Java版本对比:特性、升级改动与优势分析
Java版本对比:特性、升级改动与优势分析
311 0
|
Dubbo Java 应用服务中间件
双活工作下的数据迁移:Nacos注册中心实战解析
这篇内容介绍了如何使用NacosSync组件进行双活项目中的注册中心数据迁移。首先,准备包括64位OS、JDK 1.8+、Maven 3.2+和MySQL 5.6+的环境。接着,获取并解压NacosSync安装包,配置数据库连接,启动服务,并通过访问特定URL检查系统状态。然后,通过NacosSync控制台进行集群配置,添加Zookeeper和Nacos集群,并设置同步任务。当数据同步完成后,Dubbo客户端(Consumer和Provider)更新配置以连接Nacos注册中心。最后,迁移完成后,原有的Zookeeper集群可下线,整个过程确保了服务的平滑迁移。
442 1