SWT鼠标单击实现

最近,我做了一些SWT定制小部件的开发,偶然发现了一个问题, 为什么没有默认的SWT鼠标单击侦听器? 由于这个主题有时会提出,所以我认为写一两句话来说明背后的理性基础以及如何实现鼠标单击通常不会受到伤害。

SWT鼠标请点击

事件驱动的窗口小部件工具箱通常区分低级事件和语义事件。 低电平事件表示窗口系统出现或低电平输入。 鼠标和键盘输入基本上属于此组。

语义事件又是控件特定的用户交互的结果,并且可能由一个或多个低级事件组成。 例如,可以将按钮单击指定为鼠标下移,然后将其指定为鼠标上 移,而鼠标不会离开控件边界

问题的关键是控件特定的用户交互 。 可以将图像单击指定为鼠标下移,然后单击鼠标上移而不离开图像特定区域的边界。 差别不大,但意义重大。

语义事件类型SWT.Selection例如,对应于上面为org.eclipse.swt.widgets.Button控件提供的按钮单击规范。 但是它的组成在org.eclipse.swt.widgets.Slider上却大不相同。 后者的行为很像图像单击定义:

鼠标单击滑块

显然,没有人愿意为每个控件区域上的鼠标单击事件添加特定的侦听器。 这是更舒适的基础上那些低级别的赛事有一个语义抽象,对关键点或兴趣通知观察者1

单击按钮以自定义小部件

那么,按钮单击事件实现在自定义SWT小部件的(子)组件上看起来如何? 例如,考虑一个由几个标签Composite ,无论出于何种原因,其中一个标签都应作为动作触发。

点击行为可以通过在SWT的类型化事件抽象之上运行一个小的动作包装器来实现。 它可以实现/扩展org.eclipse.swt.events.MouseListener/-MouseAdapter并且可以在控件上注册以用作按钮单击侦听器:

static class ClickBehavior extends MouseAdapter {private final Runnable action;ClickBehavior( Runnable action ) {this.action = action;}@Overridepublic void mouseDown( MouseEvent event ) {// TODO: decent implementation}@Overridepublic void mouseUp( MouseEvent event ) {// TODO: decent implementation}
}

如您所见, ClickBehavior类包装了一个Runnable ,该Runnable应该通过单击观察到的控件来触发。 为此,第一步是验证是否已按下鼠标左键,并标记观察者已准备好触发 。 一个简单的mouseDown实现可能如下所示:

public static final int LEFT_BUTTON = 1;
[...]
public void mouseDown( MouseEvent event ) {if( event.button == LEFT_BUTTON ) {armed = true;}
}

第二步是检查是否在受监视的控件范围内发生了随后的mouseUp事件。 如果这样(并准备好),则语义条件已经满足并且可以触发该动作2

public void mouseUp( MouseEvent event ) {if( armed && inRange( event ) ) {action.run();}armed = false;
}static boolean inRange( MouseEvent event ) {Point size= ( ( Control )event.widget ).getSize();return    event.x >= 0 && event.x <= size.x&& event.y >= 0&& event.y <= size.y;
}

此实现足以处理例如org.eclipse.widgets.Label上的“按钮单击”事件,如以下代码片段所示:

final Shell shell = [...];
Label label = new Label( shell, SWT.NONE );
label.setText( "Click me!" );
label.addMouseListener(new ClickBehavior( new Runnable() {@Overridepublic void run() {MessageBox box = new MessageBox( shell );box.setMessage( "Label was clicked." );box.setText( "Message" );box.open();}} ) );

瞧,这是在运行时的样子:

标签点击

包起来

如上所述,SWT省略通用鼠标单击实现是有充分的理由的。 给出的示例显示了如何为自定义窗口小部件实现简单的按钮单击语义。 但是,还有更多需要考虑的地方。 小部件通常会在视觉上对鼠标按下做出反应 ,例如,表明它们已准备好触发。

因此,自定义窗口小部件代码很快就被炸毁,并趋于模糊与事件相关的各种责任。 为了将事件语义与视觉效果代码完全区分开,我通常在小助手类中提取第一个。 我什至有一个用于ButtonClick -click事件的通用版本,称为ButtonClick ,它是Xiliary P2存储库的SWT实用程序功能的一部分。

如果所有与鼠标单击相关的内容引起了对鼠标单击的实际应用的需求:如何使用下面的社交按钮共享知识?

  1. 细心的读者可能已经意识到,我忽略了滑块的拖动区域,该区域也增加了选择语义。 这是因为它与单击行为不匹配,并且将超出本讨论的范围。
  2. 值得一提的是,现实世界中的实现应确保在action.run()期间抛出运行时异常的情况下,也重置武装标志。

翻译自: https://www.javacodegeeks.com/2014/12/swt-mouse-click-implementation.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361660.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应式布局笔记

一. 布局设计 固定布局&#xff1a;以像素作为页面的基本单位&#xff0c;不管设备屏幕及浏览器宽度&#xff0c;只设计一套尺寸&#xff1b; 可切换的固定布局&#xff1a;同样以像素作为页面单位&#xff0c;参考主流设备尺寸&#xff0c;设计几套不同宽度的布局。通过设别的…

麦冬

麦冬 中文学名&#xff1a;麦冬 拉丁学名&#xff1a;Ophiopogon japonicus (Linn. f.) Ker-Gawl. 别称&#xff1a;麦门冬、沿阶草 植物界百合科 主要价值&#xff1a; 1、有养阴润肺、益胃生津、清心除烦的功效&#xff0c;用于肺燥干咳、阴虚痨嗽、喉痹咽痛、津伤口渴、…

Java EE 7 / JAX-RS 2.0 – REST上的CORS

Java EE REST应用程序通常在开箱即用的开发机器上运行良好&#xff0c;该开发机器上所有服务器端资源和客户端UI均指向“ localhost”或127.0.0.1。 但是&#xff0c;当涉及跨域部署时&#xff08;当REST客户端不再与托管REST API的服务器位于同一域时&#xff09;&#xff0c;…

jQuery框架-1.jQuery基础知识

jQuery简介 jQuery&#xff0c;顾名思义是JavaScript和查询&#xff08;Query&#xff09;&#xff0c;jQuery是免费、开源的。它可以简化查询DOM对象、处理事件、制作动画、处理Ajax交互过程且兼容多浏览器的javascript库&#xff0c;核心理念是write less,do more(写得更少,…

用CornerStone配置SVN,HTTP及svn简单使用说明

原文地址&#xff1a;&#xff1a;&#xff1a;http://my.oschina.net/joanfen/blog/194491#OSC_h2_3 一、下载地址二、安装破解方法三、添加repository 1.SVN配置 2.HTTP配置四、使用简介 1.上传项目到repository 2.下载项目 3.版本管理 a)先更新后提交 b)完成独立功…

CentOS6.4 Install FTP

目录 安装参考传输模式遇到无法显示远程文件夹报错安装参考 https://www.cnblogs.com/walblog/articles/7890226.html 传输模式 主动模式被动模式遇到无法显示远程文件夹报错 点击属性设置&#xff1a; 搞定。 转载于:https://www.cnblogs.com/mysticbinary/articles/11271647.…

用于单元测试的JUnit教程–最终指南(PDF下载)

编者注&#xff1a; 我们在Java Code Geeks上提供了许多JUnit教程&#xff0c;例如JUnit入门示例 &#xff0c; 使用断言和注释的 JUnit 示例 &#xff0c; JUnit注释示例等。 但是&#xff0c;为了方便读者&#xff0c;我们希望将所有JUnit功能收集在一份详细的指南中。 我们…

EF 拉姆达 linq if else (整理)

首先想到&#xff1a;结果不正确&#xff01; var data0 db.T_Plants2; //这里加.AsQueryable()if (locationType 1){.Where(d > d.NaturalEcosystem true);}else{.Where(d > d.BuiltUpArea true);}.Select(d > new{AnimalID d.PlantID,Species d.Species,}).To…

用jOOQ用Java编写SQL

jOOQ是“数据库优先”的类型安全的SQL API&#xff0c;使您可以直观地用Java编写SQL&#xff0c;就像Java编译器本身支持SQL语言一样。 所有数据库模式&#xff0c;表&#xff0c;列&#xff0c;过程和其他对象均作为Java对象提供&#xff0c;可以直接在jOOQ SQL API中使用。 …

BizTalk开发系列(十二) Schema设计之Group与Order

更多内容请查看&#xff1a;BizTalk动手实验系列目录 BizTalk 开发系列 开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档。因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构)。虽然BizTalk提供了对于XML消息的验证功能…

题解:CF1914E-Game with Marbles

题解&#xff1a;CF1914E-Game with Marbles 事先说明一下&#xff0c;本题解不讲解简单数据范围的算法&#xff0c;因为复杂数据范围的就很简单。 这道题的大体意思是这样的&#xff1a;小A有颜色为i(i1~n)的小球a[i]个&#xff0c;小B有颜色为i(i1~n)的小球b[i]个。现在他们…

【canvas系列】canvas实现“ 简单的Amaziograph效果”--画对称图【强迫症福利】

标题很难引人入胜&#xff0c;先放个效果图好了 如果图片吸引不了你&#xff0c;那我觉得也就没啥看的了。 demo链接&#xff1a; https://win7killer.github.io/demo_set/html_demo/canvas/can_demo/draw_roll_2.html ************************************************* 上…

python3基础:字符串、文本文件

字符串&#xff1a; 练习1&#xff1a; str "大胖三百磅不是二百磅陪着一百磅的小胖" print(str.replace("磅", "斤")) # 替换所有 print(str.replace("磅", "斤", 2)) # 替换两次len len(str) # 这句话的字数长度 pri…

[Python][小知识][NO.3] Python 使用系统默认浏览器打开指定URL的网址

1、前言 一般用到的地方&#xff1a; GUI交互界面下&#xff0c;单击某个按钮实现打开指定网址。 某帮助菜单项目&#xff0c;需要跳转网页显示时。 O.O 某XX程序&#xff0c;需要植入网页弹窗广告时... 2、方法 调用 webbrowser 包中的 open 函数即可。 (没安装该包的 CMD命令…

MyEclipse 10优化技巧

MyEclipse 10优化速度方案仍然主要有这么几个方面&#xff1a;去除无需加载的模块、取消冗余的配置、去除不必要的检查、关闭更新。第一步: 去除不需要加载的模块一个系统20%的功能往往能够满足80%的需求&#xff0c;MyEclipse也不例外&#xff0c;我们在大多数时候只需要20%的…

HTML知识点总结之img、scirpt、link标签

<img>元素 使用<img>可以在网页插入一个图片&#xff0c;但实际上<img>标签并不会在网页中直接插入图像&#xff0c;而是从网页上链接图像。 <img>的主要属性 &#xff08;1&#xff09;src属性&#xff1a;图片的路径。 &#xff08;2&#xff09;alt…

laravel中的自定义函数的加载和第三方扩展库加载

一.自定义公共函数 1. 创建文件 app/Helpers/functions.php 2. 修改项目 composer.json 3.运行composer dump-auto 4.OK&#xff0c;然后你就可以在任何地方用到 app/Helpers/functions.php 中的函数了。 二.添加第三方扩展库 1.确定你要放第三方库的目录&#xff0c;比如还是刚…

HDU 1312 Red and Black

这题就是比较水的一道搜索题了&#xff0c;BFS跟DFS都能做&#xff0c;直接看代码吧&#xff01; AC code&#xff1a; View Code 1 #include <iostream> 2 #define MAX 50 3 using namespace std; 4 int w, h; 5 char map[MAX][MAX]; 6 int dir[][2] {{0, 1}, {1, 0},…

Unity3D笔记十七 Unity3D生命周期

一个游戏组件的脚本有一个生命周期——一开始实例化&#xff0c;直到结束实例被销毁。在这期间&#xff0c;他们有时候处于激活状态&#xff0c;有时候处于非激活状态&#xff1b;对于活动&#xff0c;对用户有时候可见&#xff0c;有时候不可见 本文主要讨论常见脚本的的生命周…

自适应堆大小

在改进我们的测试平台以改进Plumbr GC问题检测器的同时 &#xff0c;我最终编写了一个小型测试用例&#xff0c;我认为这对于更广泛的读者来说可能很有趣。 我追求的目标是测试JVM在eden&#xff0c;survivor和Tenured空间之间如何分割堆方面的自适应性。 测试本身正在成批生成…