在窗口系统中,程序一般都是以事件驱动的。SWT的Control类实现了一些事件监听的注册方法,其子类都可以通过这些方法注册鼠标和键盘的监听器,通过实现这些监听器的接口,窗口组件就能响应相应的鼠标和键盘事件。
Control类是窗口组件类的基类,它定义了基本的事件监听方法,有如下一些:
addControlListener
addFocusListener
addHelpListener
addKeyListener
addMouseListener
addMouseTrackListener
addMouseMoveListener
addPaintListener
addTraverseListener
添加事件监听器步骤如下:
1. 创建事件监听器。例如:“new KeyListener()…”。
2. 通过Control类的子类添加事件监听器。例如:“text.addKeyListener()”。
常用事件有鼠标事件、键盘事件、焦点事件、窗口控制事件和选择事件,Control类的子类也可以定义添加相关的监听方法。
鼠标事件
在窗口系统中,鼠标基本上是必备的设备。一般来说,窗口中鼠标有鼠标单击、鼠标双击、鼠标进入窗口、鼠标退出窗口及鼠标移动等事件。
在SWT中,事件的响应是通过相应接口实现的,每个组件可以添加相应的事件响应实例来监听事件。例如“button.addMouseListener(listener)”,表示在button组件上添加鼠标的相应响应事件实例,其中,listener为实现监听器对象,下面就具体的鼠标事件进行介绍。
MouseListener接口
在SWT中,通过实现MouseListener接口来响应鼠标的按下、松开及双击事件,MouseListener接口如例程1所示。
例程1 MouseListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface MouseListener extends SWTEventListener {public void mouseDoubleClick(MouseEvent e);public void mouseDown(MouseEvent e);public void mouseUp(MouseEvent e);}
其中,mouseDoubleClick表示鼠标双击事件响应方法,mouseDown表示鼠标键按下事件的响应方法,mouseUp表示鼠标键起来事件的响应方法,MouseEvent为系统传入的鼠标事件的参数,MouseEvent中的button属性表示鼠标的按钮值,例如e.button等于1,表示鼠标左键按下,按钮值对应鼠标按钮.
在程序中,开发人员可以根据e.button的值判断当前用户按的是哪一个鼠标键,从而确定采用什么操作。
MouseMoveListener接口
在SWT中,通过实现MouseMoveListener接口来响应鼠标的移动事件,MouseMoveListener接口如例程2所示。
例程2 MouseMoveListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface MouseMoveListener extends SWTEventListener {public void mouseMove(MouseEvent e);}
MouseMoveListener只有mouseMove方法,用来响应窗口中鼠标移动事件。
MouseTrackListener接口
在SWT中,通过实现MouseTrackListener接口来响应鼠标进入窗口、鼠标退出窗口和鼠标停放在窗口上的事件,MouseTrackListener接口如例程3所示。
例程3 MouseTrackListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface MouseTrackListener extends SWTEventListener {public void mouseEnter(MouseEvent e);public void mouseExit(MouseEvent e);public void mouseHover(MouseEvent e);}
其中,mouseEnter表示鼠标进入窗口事件的响应方法,mouseExit表示鼠标退出窗口事件的响应方法,mouseHover表示鼠标停放在窗口上事件的响应方法。
鼠标事件实例
为了更深入地理解鼠标事件,下面通过具体的实例演示如何响应鼠标事件。该程序只是当事件触发时简单地打印出相应信息,在具体的实例中,读者可以根据需要进行修改,代码如例程4所示。
例程4 MouseEventExample.java
/*** 为了节省篇幅,所有的import类已经被注释* 读者可以通过ctrl+shift+o快捷键,自动引入所依赖的类* */public class MouseEventExample implements MouseListener, MouseMoveListener,MouseTrackListener {//显示信息的标签 Label myLabel = null;Shell shell = null;public MouseEventExample() {}public void run() {Display display = new Display();Shell shell = new Shell(display);shell.setLayout(new GridLayout());shell.setSize(450, 200);shell.setText("Mouse Event Example");myLabel = new Label(shell, SWT.BORDER);myLabel.setText("I ain't afraid of any old mouse");//在当前窗口上添加鼠标响应事件 shell.addMouseListener(this);shell.addMouseMoveListener(this);shell.addMouseTrackListener(this);shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}public static void main(String[] args) {new MouseEventExample().run();}public void mouseDoubleClick(MouseEvent e) {myLabel.setText("Double Click " + e.button + " at: " + e.x + "," + e.y);System.out.println("Double Click " + e.button + " at: " + e.x + ","+ e.y);}public void mouseDown(MouseEvent e) {myLabel.setText("Button " + e.button + " Down at: " + e.x + "," + e.y);System.out.println("Button " + e.button + " Down at: " + e.x + ","+ e.y);}public void mouseUp(MouseEvent e) {myLabel.setText("Button " + e.button + " Up at: " + e.x + "," + e.y);System.out.println("Button " + e.button + " Up at: " + e.x + "," + e.y);}public void mouseMove(MouseEvent e) {myLabel.setText("Mouse Move at: " + e.x + "," + e.y);System.out.println("Mouse Move at: " + e.x + "," + e.y);}public void mouseEnter(MouseEvent e) {myLabel.setText("Mouse Enter at: " + e.x + "," + e.y);System.out.println("Mouse Enter at: " + e.x + "," + e.y);}public void mouseExit(MouseEvent e) {myLabel.setText("Mouse Exit at: " + e.x + "," + e.y);System.out.println("Mouse Exit at: " + e.x + "," + e.y);}public void mouseHover(MouseEvent e) {myLabel.setText("Mouse Hover at: " + e.x + "," + e.y);System.out.println("Mouse Hover at: " + e.x + "," + e.y);}}
MouseEventExample类实现了MouseListener、MouseMoveListener和MouseTrackListener 3个接口,并通过“shell.addMouseListener(this);”、“shell.addMouseMoveListener(this);”和“shell.addMouseTrackListener(this);”把自己作为监听器添加到了窗口中
键盘事件
键盘事件是最简单,也是最常用的事件。一般来说,键盘事件有两种:键按下和键松开。SWT通过KeyListener响应键盘事件。
KeyListener接口
在SWT中,通过实现KeyListener接口来响应键按下和松开的事件。KeyListener接口如例程5所示。
例程5 KeyListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface KeyListener extends SWTEventListener {public void keyPressed(KeyEvent e);public void keyReleased(KeyEvent e);}
其中,keyPressed表示键按下事件的响应方法,keyReleased表示键松开事件的响应方法,KeyEvent为系统传入的键盘事件的参数,用户可以通过KeyEvent参数找到相应的按键值。
键盘事件实例
为了更深入地了解键盘事件,下面通过具体的实例演示如何响应键盘事件。该程序只是当事件触发时简单地打印出相应信息,在具体的实例中,读者可以根据需要进行修改,代码如例程6所示。
例程6 KeyListenerExample.java
public class KeyListenerExample {Display display;Shell shell;KeyListenerExample() {display = new Display();shell = new Shell(display);shell.setSize(250, 200);shell.setText("A KeyListener Example");Text text = new Text(shell, SWT.BORDER);text.setBounds(50 ,50 ,100, 20);text.addKeyListener(new KeyListener() {public void keyPressed(KeyEvent e) {System.out.println("key Pressed -"+e.character);}public void keyReleased(KeyEvent e) {System.out.println("key Released -"+e.character);}});shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch())display.sleep();}display.dispose();}public static void main(String[] args) {new KeyListenerExample();}}
程序中通过匿名内部类实现监听器,这种方式在实例开发中会经常用到。另外可以通过KeyEvent取得按键的值,如上例的“e.character”得到按键的字符。
焦点事件
在窗口系统中,当组件获得输入焦点或失去焦点时将触发相应的事件。SWT通过FocusListener监听焦点事件。
FocusListener接口
在SWT中,通过实现FocusListener接口来响应获得焦点和失去焦点的事件。FocusListener接口如例程7所示。
例程7 FocusListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface FocusListener extends SWTEventListener {public void focusGained(FocusEvent e);public void focusLost(FocusEvent e);}
其中,focusGained表示组件获得焦点事件的响应方法,focusLost表示组件失去焦点事件的响应方法,FocusEvent为系统传入的焦点事件的参数,用户可以通过FocusEvent参数找到相应的组件。
焦点事件实例
为了更深入地理解焦点事件,下面通过具体的实例演示如何响应焦点事件。该程序只是简单地改变当前获得焦点和失去焦点组件的显示信息,在具体的实例中,读者可以根据需要进行修改,代码如例程8所示。
例程8 FocusListenerExample.java
public class FocusListenerExample {public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shell.setLayout(new GridLayout(3, true));shell.setText("One Potato, Two Potato");//新建焦点监听器 FocusListener listener = new FocusListener() {public void focusGained(FocusEvent event) {//获得触发事件的组件 Button button = (Button) event.getSource(); //焦点获得时改变显示文本 button.setText("I'm It!");}public void focusLost(FocusEvent event) { //获得触发事件的组件 Button button = (Button) event.getSource();//焦点获得时改变显示文本 button.setText("Pick Me!");}};for (int i = 0; i < 6; i++) {Button button = new Button(shell, SWT.PUSH);button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));button.setText("Pick Me!");button.addFocusListener(listener);}shell.pack();shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}}
程序中显示了6个按钮,并为按钮添加上了焦点监听器.
窗口控制事件
在窗口系统中,当组件被移动或改变大小时将触发相应的事件。SWT通过ControlListener监听窗口控制事件。
ControlListener接口
在SWT中,通过实现ControlListener接口来响应组件被移动或改变大小的事件。ControlListener接口如例程9所示。
例程9 ControlListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface ControlListener extends SWTEventListener {public void controlMoved(ControlEvent e);public void controlResized(ControlEvent e);}
其中,controlMoved表示组件被移动事件的响应方法,controlResized表示组件被改变大小事件的响应方法,ControlEvent为系统传入的窗口控制事件的参数,用户可以通过ControlEvent参数找到相应的组件。
窗口控制事件实例
为了更深入地理解窗口控制事件,下面通过具体的实例演示如何响应窗口控制事件。该程序只是简单地打印组件被移动或改变大小的信息,在具体的实例中,读者可以根据需要进行修改,代码如例程10所示。
例程10 ControlListenerExample.java
public class ControlListenerExample {public void run() {Display display = new Display();Shell shell = new Shell(display);shell.addControlListener(new ControlListener() {public void controlMoved(ControlEvent e) {System.out.println("control move");}public void controlResized(ControlEvent e) {System.out.println("control resize");}});shell.pack();shell.open();while (!shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}public static void main(String[] args) {new ControlListenerExample().run();}}
上例显示的只是一个空白的窗口,当用户移动窗口或改变窗口大小时,将会触发监听器所实现的事件。
选择事件
SWT的很多组件都实现了选择组件事件的监听机制,例如按钮、菜单项的选择,当选择了相关的菜单项或组件时,将触发相应的事件。
SelectionListener接口
在SWT中,通过实现SelectionListener接口来响应选择组件事件。SelectionListener接口如例程11所示。
例程11 SelectionListener.java
package org.eclipse.swt.events;import org.eclipse.swt.internal.SWTEventListener;public interface SelectionListener extends SWTEventListener {public void widgetSelected(SelectionEvent e);public void widgetDefaultSelected(SelectionEvent e);}
其中,widgetSelected表示组件被选择事件的响应方法,widgetDefaultSelected表示组件默认选择事件的响应方法,SelectionEvent为系统传入的选择事件的参数。
选择组件事件实例
为了更深入地理解选择组件事件,下面通过具体的实例演示如何响应选择组件事件。该程序只是简单地打印组件被移动或改变大小的信息,在具体的实例中,读者可以根据需要进行修改,代码如例程12所示。
例程12 SelectonListenerExample.java
public class SelectonListenerExample {public static void main(String[] args) {Display display = new Display();final Shell mainShell = new Shell(display);Button button = new Button(mainShell, SWT.PUSH);button.setText("Close Me!");button.setBounds(10, 10, 100, 30);// 添加选择组件事件 button.addSelectionListener(new SelectionListener() {public void widgetSelected(SelectionEvent event) {System.out.println("select button");mainShell.close();}public void widgetDefaultSelected(SelectionEvent e) {// 不执行任何操作 }});mainShell.open();while (!mainShell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}display.dispose();}}
上例中只是添加了一个按钮,当选择按钮时关闭当前窗口。
其他常用事件
SWT中为了实现特定的功能,很多组件都提供了特定事件的响应,本节将通过实例介绍HelpListener、VerifyListener和ModifyListener 3个特定的事件监听器。
HelpListener、VerifyListener和ModifyListener监听器的功能
HelpListener监听器通过helpRequested(HelpEvent e)方法响应用户的帮助请求事件,当用户在组件获得焦点后按【F1】键将触发此事件。
VerifyListener监听器通过verifyText(VerifyEvent e)方法响应校验输入事件。此监听器只对文本输入校验,当用户输入了数据后,verifyText方法将通过设置VerifyEvent中的doit属性判断输入是否正确,从而确定修改是否有效。doit属性为true时修改有效,即“e.doit = true;”。
ModifyListener监听器通过modifyText(ModifyEvent e)方法响应文本被修改的事件。此监听器只对文本输入校验。
提示:如果VerifyListener监听器和ModifyListener监听器同时存在的话,会先响应校验输入事件,如果校验成功再响应修改事件。
提示:一般来说,监听器都有一个抽象的Adaper类实现监听器的方法,例如FocusAdapter实现了FocusListener的方法(方法为空)。如果读者不想实现监听器的全部方法则可以继承监听器的Adaper类,否则要实现监听器接口的所有方法。
相关推荐
### SWT JFace 按键、事件、监听 #### 概述 SWT(Standard Widget Toolkit)是Eclipse平台下的图形界面开发工具包,而JFace则是基于SWT之上的高级用户界面工具集。SWT提供了低级别的组件,用于创建跨平台的图形...
SWT事件处理机制是其核心特性之一,它允许开发者响应各种用户交互行为,从而实现动态和响应式的界面设计。 ### SWT事件类型及处理 #### ControlEvent:控件事件 - **监听器和适配器**:`ControlListener`和`...
在SWT中,我们可以通过实现`MouseListener`接口来监听鼠标事件。`MouseListener`接口包含三个方法:`mouseDown()`, `mouseUp()`, 和 `mouseDoubleClick()`。在这个例子中,我们关心的是`mouseDoubleClick()`方法。...
在SWT中,事件和事件监听器是通过事件监听器表(Listener List)来管理的。开发者可以注册一个或多个监听器到组件上,比如Display的PaintListener、Control的MouseListener等。SWT事件类通常包含处理事件所需的所有...
5. **Event和Listener**: SWT事件模型基于事件和监听器。事件是用户与GUI交互时发生的行为,如点击按钮或改变文本;监听器是注册在Widget上以响应这些事件的代码。 **SWT的主要特点** 1. **原生外观**: SWT通过...
4. **EventTable**:SWT的EventTable是事件管理的核心,它存储了事件监听器并处理事件分发。UI组件可以通过addXXListener方法将监听器添加到EventTable,从而接收事件。 5. **CustomPaint**:对于自定义绘制的需求...
3. **事件处理**: SWT通过监听器模型处理用户交互。你可以为每个组件添加事件监听器,如`addSelectionListener`、`addModifyListener`等。当用户进行特定操作时,监听器会触发相应的事件处理器方法,你可以在此方法...
- SWT事件模型基于监听器模式,开发者可以创建事件监听器类,实现特定的事件接口,如ActionListener、SelectionListener等,来响应用户操作。 - SWT事件包括按键事件、鼠标事件、焦点事件等,通过事件对象可以获取...
SWT通过监听器模式处理用户交互,即为组件注册特定类型的事件监听器,当事件发生时,相应的监听器方法会被调用。SWT支持各种类型的事件,如鼠标点击、键盘输入、窗口关闭等,事件处理机制是实现动态、响应式GUI的...
Display 事件循环中,同时处理着系统队列和一个应用程序级别的自定义队列中的事件,它从这些队列中读取事件,并将这些事件传递给相应的事件监听器来完成具体的实现。 三、图形资源释放 SWT 中常见的图形资源都继承...
2. **及时解除监听器绑定**:当不再需要监听某个事件时,应移除对应的事件监听器,避免持有对控件的引用。 3. **避免全局变量和静态变量持有 SWT 对象**:全局和静态变量的生命周期很长,可能导致对象长时间保持在...
理解事件监听器和事件处理方法,可以编写响应用户操作的代码。 4. **对话框**:SWT提供了诸如消息对话框(MessageDialog)、输入对话框(InputDialog)和文件选择对话框(FileDialog)等,学习如何创建和使用这些...
3. SWT事件处理:SWT事件模型允许开发者监听和响应用户的交互,例如点击按钮或输入文本。事件处理器是通过添加监听器(如SelectionListener、FocusListener)到组件来实现的。 4. Display与Shell:在SWT中,Display...
3. SWT事件和监听器:在SWT中,事件处理是通过添加监听器到组件上实现的。例如,ButtonListener可以监听按钮的点击事件,SelectionListener可以监听多种类型的选中事件。开发者可以通过实现相应的接口或者继承特定的...
为了实现在 TableItem 内部显示多行文本的效果,我们需要自定义监听器来处理相关的事件,例如 MeasureItem、PaintItem 和 EraseItem 事件。下面我们将详细解释这些事件的用途及其实现过程。 #### 1. MeasureItem ...
SWT组件支持事件驱动编程,每个组件都有对应的事件类和监听器接口。例如,Button组件有SelectionListener,可以监听按钮的点击事件。开发者通过实现相应的监听器接口并注册到组件上,即可处理用户交互。 6. SWT与...
- **事件处理**:SWT采用了类似AWT的事件监听机制,使得开发者可以响应用户的交互操作。 #### 3. SWT包结构 SWT的包结构清晰地组织了各个组件和服务。主要包包括: - **org.eclipse.swt**:核心包,包含SWT的基础...
SWT事件监听机制 SWT采用了事件驱动模型,支持多种类型的事件,如鼠标事件、键盘事件等。开发者可以通过监听器模式来响应这些事件。 #### 7. 应用SWT绘制2D图像 SWT提供了强大的绘图能力,支持基本的2D图形绘制...
4. **事件驱动**: SWT基于事件驱动模型,通过添加监听器处理用户交互。 ### SWT与Java Swing的对比 - **Swing**: 它是Java标准库的一部分,提供了一种抽象的、跨平台的UI框架,其界面元素不完全模仿操作系统原生...
控件通过事件监听器来响应用户的交互。 3. **布局(Layouts)** 布局管理器负责控制控件在父容器中的位置和大小。SWT提供了多种布局策略,如FillLayout、GridLayout、RowLayout和 MigLayout等,开发者可以根据需求...