java

位置:IT落伍者 >> java >> 浏览文章

Eclipse开发经典教程:SWT事件


发布日期:2022年06月08日
 
Eclipse开发经典教程:SWT事件
在窗口系统中程序一般都是以事件驱动的SWT的Control类实现了一些事件监听的注册方法其子类都可以通过这些方法注册鼠标和键盘的监听器通过实现这些监听器的接口窗口组件就能响应相应的鼠标和键盘事件

Control类是窗口组件类的基类它定义了基本的事件监听方法有如下一些

addControlListeneraddFocusListeneraddHelpListeneraddKeyListeneraddMouseListeneraddMouseTrackListeneraddMouseMoveListeneraddPaintListeneraddTraverseListener

添加事件监听器步骤如下

创建事件监听器例如new KeyListener()…

通过Control类的子类添加事件监听器例如textaddKeyListener()

常用事件有鼠标事件键盘事件焦点事件窗口控制事件和选择事件Control类的子类也可以定义添加相关的监听方法

鼠标事件

在窗口系统中鼠标基本上是必备的设备一般来说窗口中鼠标有鼠标单击鼠标双击鼠标进入窗口鼠标退出窗口及鼠标移动等事件

在SWT中事件的响应是通过相应接口实现的每个组件可以添加相应的事件响应实例来监听事件例如buttonaddMouseListener(listener)表示在button组件上添加鼠标的相应响应事件实例其中listener为实现监听器对象下面就具体的鼠标事件进行介绍

MouseListener接口

在SWT中通过实现MouseListener接口来响应鼠标的按下松开及双击事件MouseListener接口如例程所示

例程 MouseListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;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属性表示鼠标的按钮值例如ebutton等于表示鼠标左键按下按钮值对应鼠标按钮如表所示

在程序中开发人员可以根据ebutton的值判断当前用户按的是哪一个鼠标键从而确定采用什么操作

MouseMoveListener接口

在SWT中通过实现MouseMoveListener接口来响应鼠标的移动事件MouseMoveListener接口如例程所示

例程 MouseMoveListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface MouseMoveListener extends SWTEventListener {public void mouseMove(MouseEvent e);}

MouseMoveListener只有mouseMove方法用来响应窗口中鼠标移动事件

MouseTrackListener接口

在SWT中通过实现MouseTrackListener接口来响应鼠标进入窗口鼠标退出窗口和鼠标停放在窗口上的事件MouseTrackListener接口如例程所示

例程 MouseTrackListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface MouseTrackListener extends SWTEventListener {public void mouseEnter(MouseEvent e);public void mouseExit(MouseEvent e);public void mouseHover(MouseEvent e);}

其中mouseEnter表示鼠标进入窗口事件的响应方法mouseExit表示鼠标退出窗口事件的响应方法mouseHover表示鼠标停放在窗口上事件的响应方法

鼠标事件实例

为了更深入地理解鼠标事件下面通过具体的实例演示如何响应鼠标事件该程序只是当事件触发时简单地打印出相应信息在具体的实例中读者可以根据需要进行修改代码如例程所示

例程 MouseEventExamplejava

/*** 为了节省篇幅所有的import类已经被注释* 读者可以通过ctrl+shift+o快捷键自动引入所依赖的类* 如果有问题可发邮件到* */public class MouseEventExample implements MouseListener MouseMoveListenerMouseTrackListener {//显示信息的标签 Label myLabel = null;Shell shell = null;public MouseEventExample() {}public void run() {Display display = new Display();Shell shell = new Shell(display);shellsetLayout(new GridLayout());shellsetSize( );shellsetText(Mouse Event Example);myLabel = new Label(shell SWTBORDER);myLabelsetText(I aint afraid of any old mouse);//在当前窗口上添加鼠标响应事件 shelladdMouseListener(this);shelladdMouseMoveListener(this);shelladdMouseTrackListener(this);shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}public static void main(String[] args) {new MouseEventExample()run();}public void mouseDoubleClick(MouseEvent e) {myLabelsetText(Double Click + ebutton + at: + ex + + ey);Systemoutprintln(Double Click + ebutton + at: + ex + + ey);}public void mouseDown(MouseEvent e) {myLabelsetText(Button + ebutton + Down at: + ex + + ey);Systemoutprintln(Button + ebutton + Down at: + ex + + ey);}public void mouseUp(MouseEvent e) {myLabelsetText(Button + ebutton + Up at: + ex + + ey);Systemoutprintln(Button + ebutton + Up at: + ex + + ey);}public void mouseMove(MouseEvent e) {myLabelsetText(Mouse Move at: + ex + + ey);Systemoutprintln(Mouse Move at: + ex + + ey);}public void mouseEnter(MouseEvent e) {myLabelsetText(Mouse Enter at: + ex + + ey);Systemoutprintln(Mouse Enter at: + ex + + ey);}public void mouseExit(MouseEvent e) {myLabelsetText(Mouse Exit at: + ex + + ey);Systemoutprintln(Mouse Exit at: + ex + + ey);}public void mouseHover(MouseEvent e) {myLabelsetText(Mouse Hover at: + ex + + ey);Systemoutprintln(Mouse Hover at: + ex + + ey);}}

MouseEventExample类实现了MouseListenerMouseMoveListener和MouseTrackListener 个接口并通过shelladdMouseListener(this);shelladdMouseMoveListener(this);shelladdMouseTrackListener(this);把自己作为监听器添加到了窗口中程序运行效果如图所示

鼠标事件实例

键盘事件

键盘事件是最简单也是最常用的事件一般来说键盘事件有两种键按下和键松开SWT通过KeyListener响应键盘事件

KeyListener接口

在SWT中通过实现KeyListener接口来响应键按下和松开的事件KeyListener接口如例程所示

例程 KeyListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface KeyListener extends SWTEventListener {public void keyPressed(KeyEvent e);public void keyReleased(KeyEvent e);}

其中keyPressed表示键按下事件的响应方法keyReleased表示键松开事件的响应方法KeyEvent为系统传入的键盘事件的参数用户可以通过KeyEvent参数找到相应的按键值

键盘事件实例

为了更深入地了解键盘事件下面通过具体的实例演示如何响应键盘事件该程序只是当事件触发时简单地打印出相应信息在具体的实例中读者可以根据需要进行修改代码如例程所示

例程 KeyListenerExamplejava

public class KeyListenerExample {Display display;Shell shell;KeyListenerExample() {display = new Display();shell = new Shell(display);shellsetSize( );shellsetText(A KeyListener Example);Text text = new Text(shell SWTBORDER);textsetBounds( );textaddKeyListener(new KeyListener() {public void keyPressed(KeyEvent e) {Systemoutprintln(key Pressed +echaracter);}public void keyReleased(KeyEvent e) {Systemoutprintln(key Released +echaracter);}});shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch())displaysleep();}displaydispose();}public static void main(String[] args) {new KeyListenerExample();}}

程序中通过匿名内部类实现监听器这种方式在实例开发中会经常用到另外可以通过KeyEvent取得按键的值如上例的echaracter得到按键的字符程序运行效果如图所示

键盘事件

焦点事件

在窗口系统中当组件获得输入焦点或失去焦点时将触发相应的事件SWT通过FocusListener监听焦点事件

FocusListener接口

在SWT中通过实现FocusListener接口来响应获得焦点和失去焦点的事件FocusListener接口如例程所示

例程 FocusListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface FocusListener extends SWTEventListener {public void focusGained(FocusEvent e);public void focusLost(FocusEvent e);}

其中focusGained表示组件获得焦点事件的响应方法focusLost表示组件失去焦点事件的响应方法FocusEvent为系统传入的焦点事件的参数用户可以通过FocusEvent参数找到相应的组件

焦点事件实例

为了更深入地理解焦点事件下面通过具体的实例演示如何响应焦点事件该程序只是简单地改变当前获得焦点和失去焦点组件的显示信息在具体的实例中读者可以根据需要进行修改代码如例程所示

例程 FocusListenerExamplejava

public class FocusListenerExample {public static void main(String[] args) {Display display = new Display();Shell shell = new Shell(display);shellsetLayout(new GridLayout( true));shellsetText(One Potato Two Potato);//新建焦点监听器 FocusListener listener = new FocusListener() {public void focusGained(FocusEvent event) {//获得触发事件的组件 Button button = (Button) eventgetSource();//焦点获得时改变显示文本 buttonsetText(Im It!);}public void focusLost(FocusEvent event) {//获得触发事件的组件 Button button = (Button) eventgetSource();//焦点获得时改变显示文本 buttonsetText(Pick Me!);}};for (int i = ; i < ; i++) {Button button = new Button(shell SWTPUSH);buttonsetLayoutData(new GridData(GridDataFILL_HORIZONTAL));buttonsetText(Pick Me!);buttonaddFocusListener(listener);}shellpack();shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}}

程序中显示了个按钮并为按钮添加上了焦点监听器程序运行效果如图所示

焦点事件实例

窗口控制事件

在窗口系统中当组件被移动或改变大小时将触发相应的事件SWT通过ControlListener监听窗口控制事件

ControlListener接口

在SWT中通过实现ControlListener接口来响应组件被移动或改变大小的事件ControlListener接口如例程所示

例程 ControlListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface ControlListener extends SWTEventListener {public void controlMoved(ControlEvent e);public void controlResized(ControlEvent e);}

其中controlMoved表示组件被移动事件的响应方法controlResized表示组件被改变大小事件的响应方法ControlEvent为系统传入的窗口控制事件的参数用户可以通过ControlEvent参数找到相应的组件

窗口控制事件实例

为了更深入地理解窗口控制事件下面通过具体的实例演示如何响应窗口控制事件该程序只是简单地打印组件被移动或改变大小的信息在具体的实例中读者可以根据需要进行修改代码如例程所示

例程 ControlListenerExamplejava

public class ControlListenerExample {public void run() {Display display = new Display();Shell shell = new Shell(display);shelladdControlListener(new ControlListener() {public void controlMoved(ControlEvent e) {Systemoutprintln(control move);}public void controlResized(ControlEvent e) {Systemoutprintln(control resize);}});shellpack();shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}public static void main(String[] args) {new ControlListenerExample()run();}}

上例显示的只是一个空白的窗口当用户移动窗口或改变窗口大小时将会触发监听器所实现的事件

选择事件

SWT的很多组件都实现了选择组件事件的监听机制例如按钮菜单项的选择当选择了相关的菜单项或组件时将触发相应的事件

SelectionListener接口

在SWT中通过实现SelectionListener接口来响应选择组件事件SelectionListener接口如例程所示

例程 SelectionListenerjava

package orgeclipseswtevents;import orgeclipseswtinternalSWTEventListener;public interface SelectionListener extends SWTEventListener {public void widgetSelected(SelectionEvent e);public void widgetDefaultSelected(SelectionEvent e);}

其中widgetSelected表示组件被选择事件的响应方法widgetDefaultSelected表示组件默认选择事件的响应方法SelectionEvent为系统传入的选择事件的参数

选择组件事件实例

为了更深入地理解选择组件事件下面通过具体的实例演示如何响应选择组件事件该程序只是简单地打印组件被移动或改变大小的信息在具体的实例中读者可以根据需要进行修改代码如例程所示

例程 SelectonListenerExamplejava

public class SelectonListenerExample {public static void main(String[] args) {Display display = new Display();final Shell mainShell = new Shell(display);Button button = new Button(mainShell SWTPUSH);buttonsetText(Close Me!);buttonsetBounds( );// 添加选择组件事件 buttonaddSelectionListener(new SelectionListener() {public void widgetSelected(SelectionEvent event) {Systemoutprintln(select button);mainShellclose();}public void widgetDefaultSelected(SelectionEvent e) {// 不执行任何操作 }});mainShellopen();while (!mainShellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}}

上例中只是添加了一个按钮当选择按钮时关闭当前窗口

其他常用事件

SWT中为了实现特定的功能很多组件都提供了特定事件的响应本节将通过实例介绍HelpListenerVerifyListener和ModifyListener 个特定的事件监听器

HelpListenerVerifyListener和ModifyListener监听器的功能

HelpListener监听器通过helpRequested(HelpEvent e)方法响应用户的帮助请求事件当用户在组件获得焦点后按【F】键将触发此事件

VerifyListener监听器通过verifyText(VerifyEvent e)方法响应校验输入事件此监听器只对文本输入校验当用户输入了数据后verifyText方法将通过设置VerifyEvent中的doit属性判断输入是否正确从而确定修改是否有效doit属性为true时修改有效edoit = true;

ModifyListener监听器通过modifyText(ModifyEvent e)方法响应文本被修改的事件此监听器只对文本输入校验

提示如果VerifyListener监听器和ModifyListener监听器同时存在的话会先响应校验输入事件如果校验成功再响应修改事件

HelpListenerVerifyListener和ModifyListener监听器实例

在此实例中用户可以输入华氏温度和摄氏温度通过监听器判断输入是否正确及计算相应的摄氏温度和华氏温度另外还可以按【F】键获得当前组件的信息代码如例程所示

例程 MultipleListenersExamplejava

public class MultipleListenersExample implements HelpListener VerifyListenerModifyListener {private static final double FIVE_NINTHS = / ;private static final double NINE_FIFTHS = / ;private Text fahrenheit;private Text celsius;private Label help;public void run() {Display display = new Display();Shell shell = new Shell(display);shellsetText(Temperatures);createContents(shell);shellpack();shellopen();while (!shellisDisposed()) {if (!displayreadAndDispatch()) {displaysleep();}}displaydispose();}private void createContents(Shell shell) {shellsetLayout(new GridLayout( true));new Label(shell SWTLEFT)setText(Fahrenheit:);fahrenheit = new Text(shell SWTBORDER);GridData data = new GridData(GridDataFILL_HORIZONTAL);datahorizontalSpan = ;fahrenheitsetLayoutData(data);fahrenheitsetData(Type a temperature in Fahrenheit);// 为华氏温度文本框添加监听器 fahrenheitaddHelpListener(this);fahrenheitaddVerifyListener(this);fahrenheitaddModifyListener(this);new Label(shell SWTLEFT)setText(Celsius:);celsius = new Text(shell SWTBORDER);data = new GridData(GridDataFILL_HORIZONTAL);datahorizontalSpan = ;celsiussetLayoutData(data);celsiussetData(Type a temperature in Celsius);//为摄氏温度文本框添加监听器 celsiusaddHelpListener(this);celsiusaddVerifyListener(this);celsiusaddModifyListener(this);help = new Label(shell SWTLEFT | SWTBORDER);data = new GridData(GridDataFILL_HORIZONTAL);datahorizontalSpan = ;helpsetLayoutData(data);}//响应帮助事件 public void helpRequested(HelpEvent event) {helpsetText((String) eventwidgetgetData());}//响应校验事件 public void verifyText(VerifyEvent event) {eventdoit = false;char myChar = eventcharacter;String text = ((Text) eventwidget)getText();if (myChar == && textlength() == ) eventdoit = true;if (CharacterisDigit(myChar)) eventdoit = true;if (myChar == \b) eventdoit = true;}//响应文本修改的事件 public void modifyText(ModifyEvent event) {// 删除监听器从而在modifyText过程中不会触发事件 celsiusremoveVerifyListener(this);celsiusremoveModifyListener(this);fahrenheitremoveVerifyListener(this);fahrenheitremoveModifyListener(this);Text text = (Text) eventwidget;try {int temp = IntegerparseInt(textgetText());if (text == fahrenheit) {celsiussetText(StringvalueOf((int) (FIVE_NINTHS * (temp ))));} else {fahrenheitsetText(StringvalueOf((int) (NINE_FIFTHS * temp + )));}} catch (NumberFormatException e) { /* Ignore */ }//添加监听器 celsiusaddVerifyListener(this);celsiusaddModifyListener(this);fahrenheitaddVerifyListener(this);fahrenheitaddModifyListener(this);}public static void main(String[] args) {new MultipleListenersExample()run();}}

程序运行效果如图所示

文本监听器

提示一般来说监听器都有一个抽象的Adaper类实现监听器的方法例如FocusAdapter实现了FocusListener的方法(方法为空)如果读者不想实现监听器的全部方法则可以继承监听器的Adaper类否则要实现监听器接口的所有方法

               

上一篇:Struts1.x系列教程(10):Validator验证框架入门

下一篇:struts资源文件验证表单代码