【SWT】常用代码(二)

简介: 【SWT】常用代码(二)

前言:窗口事件

很多桌面应用程序与用户的交互都是通过事件机制来实现的,如鼠标键或键盘被按下或 者释放。事件通过监听器通知应用程序哪个部件发生了什么动作,然后作出相应的反应。 org.eclipse.swt.events 包中包含了所有的 SWT 专用的事件类和监听器的接口。本章主要介绍 了如何使用基本类型和无类型的事件,并通过两个典型的事件键盘事件、鼠标按键事件作进 一步说明。

一:监听器

其实 SWT 中处理事件与 Java 的 AWT 事件类似,对于每种事件有与之对应的 Listener 类,如果一个事件为 X,那么对应的监听器(Listener)类就是 XListener,它的添加监听方法 为 addXListener,关于监听器的使用请看下面实例代码。

1. package event; 
2. import org.eclipse.swt.widgets.*; 
3. import org.eclipse.swt.*; 
4. import org.eclipse.swt.events.*; 
5. import org.eclipse.jface.dialogs.*; 
6. public class ListenerExample { 
7. public static void main(String[] args) { 
8. final Display display = Display.getDefault(); 
9. final Shell shell = new Shell(); 
10.  shell.setSize(200, 120); 
11.  shell.setText("监听器事例"); 
12. Button button = new Button(shell, SWT.PUSH); 
13.  button.setBounds(30, 25, 120, 25); 
14.  button.setText("确定"); 
15.  button.addSelectionListener(new SelectionListener() { 
16. public void widgetSelected(SelectionEvent e) { 
17.  MessageDialog.openInformation(shell, null, "HelloWorld!!"); 
18.  } 
19. public void widgetDefaultSelected(SelectionEvent e) { 
20.  } 
21.  }); 
22.  shell.open(); 
23.  shell.layout(); 
24. while (!shell.isDisposed()) { 
25. if (!display.readAndDispatch()) 
26.  display.sleep(); 
27.  } 
28.  } 
29. }

运行效果

实例:

SelectionEvent 事件当某个 GUI 元素被选中时发生,这里定义一个按钮对象,当单击“确 定 ” 按 钮 时 触 发 此 事 件 。 其 实 按 钮 对 象 通 过 addSelectionListener() 方 法 添 加 了 一 个 SelectionListener 对象。当触发此按钮时,将调用监听器的 widgetSelected()方法,此时 SelectionListener 对象(这里定义为 new SelectionListener())将事件作为该方法的参数传入。

1. button.addSelectionListener(new SelectionAdapter() { 
2. public void widgetSelected(SelectionEvent e) { 
3. MessageDialog.openInformation(shell, null, "HelloWorld!!"); 
4.  } 
5. });

SWT窗口组件与SWT世间对应表:

二:无类型事件

SWT 提供了无类型(UnType)监听器,它通过调用它的 handleEvent()方法来获知事件 (HandleEvent()为 Listener 类的方法),该方法能够处理任何的事件。用 addListener (int eventType, Listener listener)增加一个监听器到一个监听器集合,当触发了指定类型的事件时, 监听器通过 handleEvent()来获知事件。

三:键盘鼠标事件

在本节中介绍键盘事件(KeyEvent),当键被按下或释放时触发键盘事件。SWT 提供的 键盘事件如表所示。

KeyEvent 包含 4 个属性,分别为 character、doit、keyCode 和 stateMask,这 4 个属性的 意义分别如表所示。

这里需要进一步说明的是 keyCode 和 stateMask 属性。keyCode 表示键的代码,键与键码的对 应关系见表所示。

键盘事件

键盘事件采用了无类型事件方式实现。用 stateMask 与 ALT、SHIFT、CTRL 键的键码按 位进行与运算,如果得到的结果等于 0,则说明这些键被按下。当同时按下 SHIFT 键和 X 键 时,控制台将输出“SHIFT+X”;当按下任意字母键时,程序将执行 string+=event.character 语句把该键的字符输出,如果按“A”键则输出“a”;如果按下的 键为“Backspace”键,则由控制台输出“Backspace”,这是因为通 过 event.keyCode 来获取按键的键码实现分支语句的执行。

对 KeyEvent 的 character、keyCode 和 stateMask 属性讨论后, 下面来看以下 doit 属性。doit 用来表示操作是否被允许,当为 false 时操作被取消,定制一个实例通过将 doit 属性值设置为 false,来阻 止键盘往文本框输入数据信息。

实例:

1. package event; 
2. import org.eclipse.swt.widgets.*; 
3. import org.eclipse.swt.*; 
4. import org.eclipse.swt.events.*; 
5. public class KeyEventExample2 { 
6. private Text text; 
7. public KeyEventExample2() { 
8. final Display display = Display.getDefault(); 
9. final Shell shell = new Shell(); 
10.  shell.setSize(240, 155); 
11.  shell.setText("CancelKeyInput"); 
12.  text = new Text(shell, SWT.BORDER); 
13.  text.setBounds(5, 5, 220, 80); 
14. Button button = new Button(shell, SWT.PUSH); 
15.  button.setBounds(5, 90, 100, 25); 
16.  button.setText("CancelKeyInput"); 
17.  button.addSelectionListener(new SelectionAdapter() { 
18. public void widgetSelected(SelectionEvent e) { 
19.  cancelKeyInput(); 
20.  } 
21.  }); 
22.  shell.open(); 
23.  shell.layout(); 
24. while (!shell.isDisposed()) { 
25. if (!display.readAndDispatch()) 
26.  display.sleep(); 
27.  } 
28.  } 
29. public void cancelKeyInput() { 
30.  text.addKeyListener(new KeyAdapter() { 
31. public void keyPressed(KeyEvent e) { 
32.  e.doit = false; 
33.  } 
34. }); 
35.  } 
36. public static void main(String[] args) { 
37. new KeyEventExample2(); 
38.  } 
39. }

鼠标事件

鼠标事件操作包括:鼠标键的按下、释放、双击和鼠标光标在 GUI 上移动或位于其上方 而触发。

实例

stateMask 检测键盘按键 Alt、Shift、Ctrl 键和鼠标键 Button1、Button2、Button3(左、 中、右)是否同时按下,下面代码实现了鼠标事件触发时的状态(源代码对应光盘上 “MouseEventExample.java”文件):

1. package event; 
2. import org.eclipse.swt.*; 
3. import org.eclipse.swt.widgets.*; 
4. public class MouseEventExample { 
5.  public MouseEventExample() { 
6. final Display display = Display.getDefault(); 
7. final Shell shell = new Shell(); 
8.  shell.setSize(500, 375); 
9.  shell.setText("MouseEvent 实例"); 
10.  Listener listener = new Listener() { 
11.  public void handleEvent(Event e) { 
12. String string = ""; 
13.  switch (e.type) { 
14.  case SWT.MouseDown: 
15. string += "DOWN"; 
16.  break; 
17.  case SWT.MouseUp: 
18. string += "UP"; 
19.  break; 
20.  case SWT.MouseMove: 
21. string += "MOVE"; 
22.  break; 
23.  case SWT.MouseDoubleClick: 
24. string += "DOUBLE"; 
25.  break; 
26.  case SWT.MouseEnter: 
27. string += "ENTER"; 
28.  break; 
29.  case SWT.MouseExit: 
30. string += "EXIT"; 
31.  break; 
32.  case SWT.MouseHover: 
33. string += "HOVER"; 
34.  break; 
35.  } 
36. if ((e.stateMask & SWT.BUTTON1) != 0) 
37. string += " BUTTON1"; 
38. if ((e.stateMask & SWT.BUTTON2) != 0)
39. string += " BUTTON2"; 
40. if ((e.stateMask & SWT.BUTTON3) != 0) 
41. string += " BUTTON3"; 
42. if ((e.stateMask & SWT.ALT) != 0) 
43. string += " ALT"; 
44. if ((e.stateMask & SWT.SHIFT) != 0) 
45. string += " SHIFT"; 
46. string += ", x=" + e.x + ", y=" + e.y; 
47.  System.out.println(string); 
48.  } 
49.  }; 
50.  shell.addListener(SWT.MouseDown, listener); 
51.  shell.addListener(SWT.MouseUp, listener); 
52.  shell.addListener(SWT.MouseDoubleClick, listener); 
53.  shell.addListener(SWT.MouseMove, listener); 
54.  shell.addListener(SWT.MouseEnter, listener); 
55.  shell.addListener(SWT.MouseExit, listener); 
56.  shell.addListener(SWT.MouseHover, listener); 
57.  shell.open(); 
58.  shell.layout(); 
59.  while (!shell.isDisposed()) { 
60. if (!display.readAndDispatch()) 
61. display.sleep(); 
62.  } 
63.  } 
64.  public static void main(String[] args) { 
65.  new MouseEventExample(); 
66.  } 
67. }
相关文章
|
5月前
|
人工智能 中间件 程序员
大模型上下文协议 MCP 带来了哪些货币化机会
本文探讨了MCP(Model-Calling Protocol)的兴起及其对AI生态的影响。自2月中旬起,MCP热度显著提升,GitHub Star和搜索指数均呈现加速增长趋势。MCP通过标准化协议连接大模型与外部工具,解决了碎片化集成问题,推动AI应用货币化及生态繁荣。文章分析了MCP与Function Calling的区别,指出MCP更适用于跨平台、标准化场景,而Function Calling在特定实时任务中仍具优势。此外,MCP促进了 supply端(如云厂商、大模型、中间件服务商)和消费端(终端用户)的变革,尤其以Devin和Manus为代表,分别改变了程序员和普通用户的交互方式。
692 37
大模型上下文协议 MCP 带来了哪些货币化机会
|
10月前
|
网络协议 安全 NoSQL
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练等具体操作详解步骤;精典图示举例说明、注意点及常见报错问题所对应的解决方法IKUN和I原们你这要是学不会我直接退出江湖;好吧!!!
网络空间安全之一个WH的超前沿全栈技术深入学习之路(8-2):scapy 定制 ARP 协议 、使用 nmap 进行僵尸扫描-实战演练、就怕你学成黑客啦!
|
11月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
504 2
|
11月前
|
Serverless 数据安全/隐私保护 前端开发
大模型代码能力体验报告之贪吃蛇小游戏《一》:Claude.ai篇 - 生成、预览和快速部署的serverless一条龙
本文介绍了通过Claude.ai生成并优化Web版贪吃蛇游戏的过程,展示了其强大的代码生成功能及用户友好的界面设计。从初始版本的快速生成到根据用户反馈调整游戏速度,再到提供多种实用工具如文件管理、版本控制和一键部署,Claude.ai不仅是一个代码助手,更像是一个全面的serverless开发平台。文中还呼吁国内厂商关注此类技术的发展。
484 2
|
传感器 自然语言处理 机器人
ROS2教程03 ROS2节点
本文是关于ROS2(机器人操作系统2)节点的教程,涵盖了节点的概念、特性、使用方法,以及如何编写、测试和使用ROS2节点相关的命令行工具。文章介绍了节点的独立性、任务执行、跨硬件分布和多语言编写能力。详细解释了如何启动节点、查看节点信息、编写节点代码(包括面向过程和面向对象的方法),以及如何为功能包添加依赖和入口点。此外,还探讨了重映射节点名称和使用节点命令行工具的方法,如 `ros2 node info` 和 `ros2 node list`。适合已安装ROS2 Humble和Ubuntu 22.04操作系统,并具有Shell基础知识的读者学习。
694 1
|
关系型数据库 MySQL iOS开发
macOS Catalina(10.15)如何访问iPhone(Ipad)的应用文档文件
macOS Catalina(10.15)如何访问iPhone(Ipad)的应用文档文件
434 0
|
Python
NumPy 数学函数库详解
【8月更文第30天】NumPy(Numerical Python)是 Python 中用于科学计算的核心库之一,它提供了大量的高性能数学函数,并且是其他许多科学计算库的基础。本文将详细介绍 NumPy 中的数学函数,包括统计函数、线性代数函数以及傅里叶变换等功能。
268 0
|
存储 弹性计算 小程序
阿里云服务器的四种购买方式及其适合对象和购买流程简介
对于第一次购买云服务器的新手用户来说,阿里云服务器购买页面有点复杂,从云服务器购买、配置选择到网站上线全过程都是很多新手用户关心的问题,2023年了,小编决定写一篇阿里云服务器购买流程的图文教程。
634 1
阿里云服务器的四种购买方式及其适合对象和购买流程简介
|
Java 应用服务中间件 数据库连接
软件版本变化流程(alpha/RC/Release)
软件版本变化流程(alpha/RC/Release)
446 2
|
Java BI API
探索Batik库:优雅处理SVG图形的利器
在现代的应用开发中,矢量图形的使用越来越广泛,特别是在Web开发和图像处理领域。Batik库作为一款优雅的SVG图形处理工具,可以帮助我们生成、操作和展示矢量图形。本文将深入探讨Batik库的基本概念、特点,以及如何在实际应用中使用它进行SVG图形处理。
2080 0