一.事件处理的常用方法——内部匿名类
//事件处理的步骤
list.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e){
System.out.println("widgetSelected事件");
}
public void widgetDefaultSelected(SelectionEvent e){
System.out.println("widgetDefaultSelected事件");
}//两个都需要
});
二.事件处理的常用方法——内部类
//事件处理的步骤
//内部类
SelectionListener listener= new SelectionListener(){
public void widgetSelected(SelectionEvent e){
System.out.println("widgetSelected事件——单击");
}
public void widgetDefaultSelected(SelectionEvent e){
System.out.println("widgetDefaultSelected事件——双击");
}
};
list.addSelectionListener(listener);
//使用内部类,不仅要为控件注册监听器,也可以在需要时移除该监听器。
//list.removeSelectionListener(listener);
好处:(1)可以为多个控件注册同一个监听器。例如一个菜单项和按钮具有相同的事件处理的方法。实现代码的复用。
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.*;
public class E{
public static void main(String[] args){
Display display=new Display();
Shell shell=new Shell(display);
shell.setText("事件处理的常用方法——内部类,多个控件注册同一个监视器");
shell.setLayout(new FillLayout());
//事件处理的步骤
//内部类
SelectionListener listener=new SelectionListener(){
public void widgetSelected(SelectionEvent e){
System.out.println("widgetSelected事件——单击");
}
public void widgetDefaultSelected(SelectionEvent e){
System.out.println("widgetDefaultSelected事件——双击");
}
};
Button button1=new Button(shell,SWT.PUSH);
button1.setText("按钮1");
button1.addSelectionListener(listener);
Button button2=new Button(shell,SWT.PUSH);
button2.setText("按钮2");
button2.addSelectionListener(listener);
// MenuItem menuItem=new MenuItem(menu,SWT.PUSH);
// menuItem.addSelectionListener(listener);
//打开窗口,进行窗口的显示
//shell.setSize(400,400);
shell.pack();
shell.open();
while(!shell.isDisposed()){
//当窗口没有被释放的时候
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}
(2)通过内部类可以处理不同的事件。例如:有两个按钮,分别注册了同一个监听器对象,如何区分是哪一个按钮触发的事件呢?
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.*;
public class F{
public static void main(String[] args){
Display display=new Display();
Shell shell=new Shell(display);
shell.setText("事件处理的常用方法——通过内部类处理不同的事件");
shell.setLayout(new FillLayout());
final Button button1=new Button(shell,SWT.PUSH);
button1.setText("按钮1");
final Button button2=new Button(shell,SWT.PUSH);
button2.setText("按钮2");
//事件处理的步骤
//内部类
SelectionListener listener=new SelectionListener(){
public void widgetSelected(SelectionEvent e){
Widget widget=e.widget;
if(widget==button1){
//如果是按钮1触发的事件
System.out.println("widgetSelected事件——button1单击");
}
else if(widget==button2){
//如果是按钮2触发的事件
System.out.println("widgetSelected事件——button2单击");
}
}
public void widgetDefaultSelected(SelectionEvent e){
}
};
button1.addSelectionListener(listener);
button2.addSelectionListener(listener);
// MenuItem menuItem=new MenuItem(menu,SWT.PUSH);
// menuItem.addSelectionListener(listener);
//打开窗口,进行窗口的显示
//shell.setSize(400,400);
shell.pack();
shell.open();
while(!shell.isDisposed()){
//当窗口没有被释放的时候
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}
源码(内部类)
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.*;
public class D{
public static void main(String[] args){
Display display=new Display();
Shell shell=new Shell(display);
shell.setText("事件处理的常用方法——内部类");
shell.setLayout(new FillLayout());
final List list=new List(shell,SWT.NONE);
for(int i=0;i<10;i++){
list.add("item"+i);
}
//事件处理的步骤
//内部类
SelectionListener listener= new SelectionListener(){
public void widgetSelected(SelectionEvent e){
System.out.println("widgetSelected事件——单击");
}
public void widgetDefaultSelected(SelectionEvent e){
System.out.println("widgetDefaultSelected事件——双击");
}
};
list.addSelectionListener(listener);
//使用内部类,不仅要为控件注册监听器,也可以在需要时移除该监听器。
//list.removeSelectionListener(listener);
//打开窗口,进行窗口的显示
//shell.setSize(400,400);
shell.pack();
shell.open();
while(!shell.isDisposed()){
//当窗口没有被释放的时候
if(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}