原创 Eclipse开发经典教程:SWT事件(IT168 阿甘)

2008-11-23 17:34 2772 6 4 分类: 软件与OS

http://www.java2s.com/Code/JavaAPI/org.eclipse.swt.events/Catalogorg.eclipse.swt.events.htm


http://tech.it168.com/j/2008-02-15/200802151712493_6.shtml


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监听器同时存在的话,会先响应校验输入事件,如果校验成功再响应修改事件。

HelpListener、VerifyListener和ModifyListener监听器实例

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

例程13 MultipleListenersExample.java


public class MultipleListenersExample implements HelpListener, VerifyListener,
ModifyListener {
private static final double FIVE_NINTHS = 5.0 / 9.0;
private static final double NINE_FIFTHS = 9.0 / 5.0;
private Text fahrenheit;
private Text celsius;
private Label help;
public void run() {
Display display
= new Display();
Shell shell
= new Shell(display);
shell.setText(
"Temperatures");
createContents(shell);
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
private void createContents(Shell shell) {
shell.setLayout(
new GridLayout(3, true));
new Label(shell, SWT.LEFT).setText("Fahrenheit:");
fahrenheit
= new Text(shell, SWT.BORDER);
GridData data
= new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan
= 2;
fahrenheit.setLayoutData(data);
fahrenheit.setData(
"Type a temperature in Fahrenheit");
// 为华氏温度文本框添加监听器
fahrenheit.addHelpListener(this);
fahrenheit.addVerifyListener(
this);
fahrenheit.addModifyListener(
this);
new Label(shell, SWT.LEFT).setText("Celsius:");
celsius
= new Text(shell, SWT.BORDER);
data
= new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan
= 2;
celsius.setLayoutData(data);
celsius.setData(
"Type a temperature in Celsius");
//为摄氏温度文本框添加监听器
celsius.addHelpListener(this);
celsius.addVerifyListener(
this);
celsius.addModifyListener(
this);
help
= new Label(shell, SWT.LEFT | SWT.BORDER);
data
= new GridData(GridData.FILL_HORIZONTAL);
data.horizontalSpan
= 3;
help.setLayoutData(data);
}
//响应帮助事件
public void helpRequested(HelpEvent event) {
help.setText((String)
event.widget.getData());
}
 
//响应校验事件
public void verifyText(VerifyEvent event) {
event.doit = false;
char myChar = event.character;
String text
= ((Text) event.widget).getText();
if (myChar == '-' && text.length() == 0) event.doit = true;
if (Character.isDigit(myChar)) event.doit = true;
if (myChar == '\b') event.doit = true;
}
 
//响应文本修改的事件
public void modifyText(ModifyEvent event) {
// 删除监听器,从而在modifyText过程中不会触发事件
celsius.removeVerifyListener(this);
celsius.removeModifyListener(
this);
fahrenheit.removeVerifyListener(
this);
fahrenheit.removeModifyListener(
this);
Text text
= (Text) event.widget;
try {
int temp = Integer.parseInt(text.getText());
if (text == fahrenheit) {
celsius.setText(String.valueOf((
int) (FIVE_NINTHS * (temp - 32))));
}
else {
fahrenheit.setText(String.valueOf((
int) (NINE_FIFTHS * temp + 32)));
}
}
catch (NumberFormatException e) { /* Ignore */ }
//添加监听器
celsius.addVerifyListener(this);
celsius.addModifyListener(
this);
fahrenheit.addVerifyListener(
this);
fahrenheit.addModifyListener(
this);
}
public static void main(String[] args) {
new MultipleListenersExample().run();
}
}


程序运行效果如图4所示。



图4 文本监听器



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


1


1 2 3 4 5 6 7
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
6
关闭 站长推荐上一条 /3 下一条